美文网首页OC多线程
dispatch_semaphore_t信号量的使用

dispatch_semaphore_t信号量的使用

作者: 吓死宝宝了啊 | 来源:发表于2017-07-28 16:00 被阅读34次

    此处crash是因为sema被销毁的时候还在被使用,系统判断sema是否被使用的标志为sema被销毁时的值是否与初始化的值相同。我们可以看一下堆栈信息

    sema导致的crash堆栈

    我们可以看到这句话"BUG IN CLIENT OF LIBDISPATCH: Semaphore object deallocated while in use"。  sema被销毁时当前的信号量必须大于等于初始化的值。

    1.sema的方法:

    //dispatch_semaphore_create(value) 参数value必须大于等于0

    dispatch_semaphore_t sema = dispatch_semaphore_create(max);

    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);此方法会使信号量value-1,当value=0时,调用此方法会阻塞线程

    dispatch_semaphore_signal(sema);此方法会发送一个信号量使value+1

    2.sema的使用:

    相关文章

      网友评论

      • 北海有鱼w:请问 当销毁控制器的时候 信号量崩溃到底该怎么解决呢
        Seas:VC释放前,dealloc方法里不管semaphore是不是被使用,使用了多少,都先dispatch_semaphore_signal初始值就可以了。
        北海有鱼w:@吓死宝宝了啊 信号量是vc持有的,报错信息就是野指针,也就是说信号还在执行,这是popVC 信号就已经被释放了,现在我不在VC持有信号量,让单例持有信号量,不会崩溃了
        吓死宝宝了啊:信号量是全局的还是局部的,crash的堆栈信息能否粘贴出来

      本文标题:dispatch_semaphore_t信号量的使用

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