http://www.cnblogs.com/snailHL/p/3906112.html
dispatch_semaphore是GCD用来同步的一种方式,与它相关有三个函数:
dispatch_semaphore_create, dispatch_semaphore_signal, dispatch_semaphore_wait
(1) dispatch_semaphore_create声明:
dispatch_semaphore_t dispatch_semaphore_create(long value);
传入参数为long,输出一个dispatch_semaphore_t类型且值为value的信号量
注意:传入参数value必须大于或等于0,否则dispatch_semaphore_create返回NULL
(2)dispatch_semaphore_signal声明:
long dispatch_semaphore_signal(dispatch_semaphore_t dsema);
这个函数会使传入的信号量dsema的值加1
(3)dispatch_semaphore_wait声明:
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout );
这个函数使传入信号量dsema值减1
函数作用:
如果dsema信号量值大于0,该函数所处线程继续执行下面语句,并且将信号量值减1;
如果dsema值为0,函数就阻塞当前线程等待timeout,等待期间desma值被dispatch_semaphore_signal函数加1了,且该函数(dispatch_semaphore_wait)所处线程获得了信号量,就继续向下执行并将信号量减1.等待期间没有获取到信号量或信号量值为0,等到timeout时,所处线程自动执行下面语句
(4)dispatch_semaphore_signal的返回值为long类型,当返回值为0时表示当前没有线程等待其处理的信号量
当返回值不为0时,表示其当前有(一个或多个)线程等待其处理的信号量,并且该函数唤醒了一个等待的线程(当线程有优先级时,唤醒优先级最高的线程;否则随机唤醒)。
dispatch_semaphore_wait返回值为long型。当其返回0时表示在timeout之前,该函数所处线程被成功唤醒。
当其返回不为0时,表示timeout发生
(5)当设置timeout时,比较有用的两个宏:DISPATCH_TIME_NOW DISPATCH_TIME_FOREVER
第一个表示当前,第二个表示遥远的未来
一般可以直接设置timeout为这两个宏其中一个,或者创建一个dispatch_time_t类型变量
dispatch_time_t t = dispatch_time(DISPATCH_TIME_NOW, 110001000*1000);
表示当前时间向后延时一秒为timeout的时间
网友评论