ios多线程中使用信号量形成死锁,阻塞主线程

最近在使用信号量时,遇到了一种死锁的情况。

    //在主线程写一段代码,并运行
    NSLog(@"1");
    dispatch_semaphore_t s = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"2");
            dispatch_semaphore_signal(s);
        });
    });
    NSLog(@"3");
    dispatch_semaphore_wait(s, DISPATCH_TIME_FOREVER);
    NSLog(@"4");
2018-02-09 11:27:28.603660+0800 test[10630:7608773] 1
2018-02-09 11:27:28.603941+0800 test[10630:7608773] 3

分析:
1.创建的总信号量为0,代码执行到dispatch_semaphore_wait时, 主线程阻塞,直到收到信号才会往下继续执行;
dispatch_semaphore_signal(s)发送信号是放在主线程中执行,由于此时主线程是阻塞的,那么dispatch_semaphore_signal(s)不会执行,这形成了死锁的情况。

修改一下代码如下,运行

    NSLog(@"1");
    dispatch_semaphore_t s = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        dispatch_semaphore_signal(s);
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"2");
        });
    });
    NSLog(@"3");
    dispatch_semaphore_wait(s, DISPATCH_TIME_FOREVER);
    NSLog(@"4");
2018-02-22 14:44:45.589003+0800 test[631:151335] 1
2018-02-22 14:44:45.589064+0800 test[631:151335] 3
2018-02-22 14:44:45.589112+0800 test[631:151335] 4
2018-02-22 14:44:45.647069+0800 test[631:151335] 2

dispatch_semaphore_signal(s)发送信号放在子线程执行,打破了死锁,代码正常执行了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 锁是一种同步机制,用于多线程环境中对资源访问的限制iOS中常见锁的性能对比图(摘自:ibireme): iOS锁的...
    LiLS阅读 1,558评论 0 6
  • 在平时的开发中经常使用到多线程,在使用多线程的过程中,难免会遇到资源竞争的问题,那我们怎么来避免出现这种问题那? ...
    IAMCJ阅读 3,140评论 2 25
  • 尝试去做一些不可能完成的事!
    hcyyy阅读 227评论 0 0
  • 晨起打卡:0 我的目标: 伴侣,创业成功,财富目标达成150万 我的伴侣特特质:英俊潇洒,健康,智慧,慷慨,有责任...
    d5fc94164165阅读 237评论 3 7
  • 我们看仙侠剧,总会有上仙历劫的桥段,基本历的都是情劫。 为何?因为对于世人来说生活里最常见的怕就是情劫。 爱上一个...
    吾爱丝语阅读 4,682评论 0 1