在Linux下面使用GCD
GCD(Grand Central Dispatch)是苹果在Mac OS X上面实现的一个C语言的多核编程方式。在iOS和Mac OS X多线程编程中苹果首推这个方式,主要原因是它由内核直接进行负载均衡,所以效率会比较高。再者它使用了被称为blocks的C语言扩展语法,这种语法实际上就是闭包。基于这种语法就可以写出类似javascript中的无阻塞异步方法,使代码非常易读。
苹果提供libdispatch这个库来支持GCD,并且将这个库开源。libdispatch依赖于BSD内核的一些服务,所以在FreeBSD 9.0之后进入到BSD ports中并且可以原生地使用。今天我搜索了一下,发现libdispatch在Debian系的Linux系统里面也已经有了支持,比如Ubuntu 12.04就有一个libdispatch-dev的包,安装之后就能使用GCD了。不过Linux的GCD并不是深入到内核的,而是在用户态模拟了一些BSD服务,所以只能说实现了一种语法显现。即便如此,GCD所带来的编程上的便利也足够体现出来了。
Ubuntu下,只要apt-get install libdispatch-dev就能安装所有依赖包了,这些依赖包主要包括llvm以及实现blocks语法的runtime。顺便说一下,如果要用GCD,就一定要用LLVM来编译,GCC是不行的。
安装好之后,新建一个test.c文件:
#include <dispatch/dispatch.h> #include <err.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { dispatch_queue_t q; dispatch_time_t t; q = dispatch_get_main_queue(); t = dispatch_time(DISPATCH_TIME_NOW, 5LL * NSEC_PER_SEC); // Print a message and exit after 5 seconds. dispatch_after(t, q, ^{ printf("block_dispatch\n"); exit(0); }); dispatch_main(); return (0); }
在终端进行编译:
clang -fblocks -o test test.c -ldispatch -lBlocksRuntime
如果编译成功,说明GCD安装是成功的。(注意后面两个参数一定要加上,在FreeBSD中,-lBlocksRuntime这个参数可以不加,但是在Linux中不加会报错)。
关于GCD更多的信息,直接参考苹果的文档 https://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html
本著作係採用創用 CC 姓名標示 2.0 通用版 授權條款授權.
2013年12月08日 14:44
谢谢!