dispatch_semaphore_t 信号量相关知识

来源:互联网 发布:java web 前后端分离 编辑:程序博客网 时间:2024/05/19 06:38

dispatch_semaphore_t是GCD系列的产物,semaphore译词有信号量一说!

与之相关的有三个函数

dispatch_semaphore_t dispatch_semaphore_create(long value);long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);long dispatch_semaphore_signal(dispatch_semaphore_t dsema);
第一个函数是创建一个信号量,其中的参数value是信号量的初始值,返回值为信号量.

第二个函数是等待信号量的函数,其中有两个参数,第一个dsema即为等待的信号量,第二个参数timeout为等待的时间,精度为ns(纳秒).返回值是long型,如果为0,表示等待成功,如果不为0则是等待超时,等待成功将会执行接下来的代码,否则将会在设置的等待时间内阻塞后面的代码!

第三个函数是对信号量进行操作,使信号量加1,参数dsema表示操作的信号量,返回值是long型,如果返回值是非零的,表示线程被唤起,否则表示线程被阻塞!

关于信号量,目前查找到的信息为,创建后会有个初始的信号量,然后如果信号量大于0的话,每wait1次信号量会减1,每signal1次信号量加1,如果信号量为0的话,wait会一直等到设置的超时时间才会执行接下来的代码,因为信号量是0,所以不会对信号量进行操作!

这可以保证wait和signal之间的代码在同一时间只能有一份在执行!

需要注意的是,create的时候设置的值不是他的上限,你也可以先给它signal两次在wait两次,也会正常执行之间的代码!

下面是常用的例子:

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);    NSMutableArray *array = [NSMutableArrayarray];    for (int index = 0; index < 100000; index++) {        dispatch_async(queue, ^(){            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);//            NSLog(@"addd :%d", index);            [array addObject:[NSNumber numberWithInt:index]];            dispatch_semaphore_signal(semaphore);        });    }
如果不加入信号量,传说有时候运行是会有崩溃现象的!

0 0