美文网首页征服iOSiOS开发坑点
ios多线程中使用信号量形成死锁,阻塞主线程

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

作者: Yancy007 | 来源:发表于2018-02-22 14:49 被阅读938次

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

    //在主线程写一段代码,并运行
    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多线程中使用信号量形成死锁,阻塞主线程

    最近在使用信号量时,遇到了一种死锁的情况。 分析:1.创建的总信号量为0,代码执行到dispatch_semaph...

  • 线程锁

    探讨iOS开发中各种锁使用NSCondition实现多线程同步 NSCondition是线程同步, 阻塞线程。 取...

  • GCD练习

    GCD练习 ios 多线程 GCD : ios 多线程 全剧队列,异步执行 线程间通信 信号量 文件锁 单利模式 ...

  • Java多线程-死锁的出现和解决

    Java多线程-死锁什么是死锁? 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释...

  • 5. 死锁

    线程死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 理解GCD

    (1)博客:深入理解GCD 理解iOS中的线程池 多线程理解 ?:(1)信号量--...

  • 6. 使用synchronized实现死锁

    死锁定义 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 死锁 GCD 多线程

    死锁 GCD 多线程 Ios - LDSmallCat - 博客园 Ios中GCD死锁困扰很多人,分享一点个人经...

  • iOS性能篇——并行开发其实很简单

    概览 1.多线程 1.1 简介 1.2 iOS 多线程 2.NSThread 2.1 解决多线程阻塞问题 2.2 ...

  • 并发编程情况下几个相应问题简介

    1.并发编程的挑战之死锁 ​ 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多...

网友评论

  • 福尔摩罗:请问 如果想实现1、2、3、4的顺序怎么实现呢,而且2是个封装的异步请求
    福尔摩罗:@北极光ydl 因为我最后的操作是return 所以dispatch_group也不管用 在最后notify的时候也是block
    福尔摩罗:@北极光ydl 需求是js调OC 的方法,获取手机通讯录,我写了一个带返回值的方法给js调用,获取通讯录的方法我用block封装了,所以我想在block 里面return 返回值,但是这样是报错的,再然后我就想用信号量改变顺序,但是信号量的释放我放在block 里面 然后在return之前wait ,atch_semaphore_create(0)时,主线程阻塞,当dispatch_semaphore_create(1)时 ,直接执行dispatch_semaphore_wait之后的代码了
    Yancy007:不太清楚您所说的需求 如果是要控制两个异步请求全部完成再去做某件事 可以考虑dispatch_group 然后使用dispatch_enter 和dispatch_leave进行控制

本文标题:ios多线程中使用信号量形成死锁,阻塞主线程

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