信号量
信号量是基于计数器的一种多线程同步机制,用来管理对资源的并发访问。
信号量就是一种可用来控制访问资源的数量的标识,设定了一个信号量,在线程访问之前,加上信号量的处理,则可告知系统按照我们指定的信号量数量来执行多个线程。
dispatch_semaphore相关的3个函数
// 创建信号量,参数:信号量的初值,如果小于0则会返回NULL
dispatch_semaphore_t dispatch_semaphore_create(long value);
// 信号量减1 timeout参数: 线程等待时间
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
// 信号量加1
long dispatch_semaphore_signal(dispatch_semaphore_t dsema);
使用dispatch_semaphore_create(long value)
创建的信号量,参数是信号量的初始值,
在线程执行到dispatch_semaphore_wait
时,系统会判断该信号量计数是否为0,不为0就可以允许另一条线程进行访问,并将该并发计数减1;为0,则阻塞当前线程,直到dispatch_semaphore_signal
将信号量加1才会继续执行。
也就是说信号量为0则阻塞线程,大于0则不会阻塞,通过改变信号量的值,来控制是否阻塞线程,从而达到线程同步。
在AFNetworking中的应用
![](https://img.haomeiwen.com/i2276492/64811044ceecd595.png)
为了确保线程同步,作者创建了一个semaphore
并指定信号量为0,意味着如果信号量不能+1的话,在线程执行到dispatch_semaphore_wait
的时候,当前线程会被阻塞,阻塞时间可以是dISPATCH_TIME_NOW
,也可以是DISPATCH_TIME_FOREVER
,DISPATCH_TIME_FOREVER
会一直等待当前信号量的增加才会继续执行。
如实例:
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSLog(@"1");
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(2);
NSLog(@"2");
dispatch_semaphore_signal(semaphore);
});
NSLog(@"3");
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"4");
}
执行顺序会是:1 ~ 3 ~ 2 ~ 4。
这样就做到了线程同步。
网友评论