在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