美文网首页
dispatch_semaphore(信号量)介绍及在知名库中的

dispatch_semaphore(信号量)介绍及在知名库中的

作者: 迷路的安然和无恙 | 来源:发表于2018-04-16 23:02 被阅读16次

信号量

信号量是基于计数器的一种多线程同步机制,用来管理对资源的并发访问。

信号量就是一种可用来控制访问资源的数量的标识,设定了一个信号量,在线程访问之前,加上信号量的处理,则可告知系统按照我们指定的信号量数量来执行多个线程。

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中的应用

image.png

为了确保线程同步,作者创建了一个semaphore并指定信号量为0,意味着如果信号量不能+1的话,在线程执行到dispatch_semaphore_wait的时候,当前线程会被阻塞,阻塞时间可以是dISPATCH_TIME_NOW,也可以是DISPATCH_TIME_FOREVERDISPATCH_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。
这样就做到了线程同步。

相关文章

网友评论

      本文标题:dispatch_semaphore(信号量)介绍及在知名库中的

      本文链接:https://www.haomeiwen.com/subject/tqyekftx.html