美文网首页
GCD之dispatch_semaphore(信号量)

GCD之dispatch_semaphore(信号量)

作者: 子键_北京不眠夜 | 来源:发表于2016-06-08 16:39 被阅读199次

    转载自原文

    一 何为信号量?

    简单来说就是控制访问资源的数量,比如系统有两个资源可以被利用,同时有三个线程要访问,只能允许两个线程访问,第三个应当等待资源被释放后再访问。
    dispatch_semaphore是持有计数的信号,该计数是多线程编程中的计数类型信号,类似于过马路的信号灯,红灯表示不能通过,而绿灯表示可以通过。

    而在dispatch_semaphore中使用计数来实现该功能,进行更细粒度的排他控制.
    在没有Serial Dispatch Queue和dispatch_barrier_async函数那么大的粒度且一部分处理需要进行排他控制的情况下,dispatch Semaphore便可发挥威力

    注意:再GCD中,只有调度的线程在信号量不足的时候才会进入内核态进行线程阻塞

    二 如何使用信号量

    三个主要函数

    创建一个信号量
    func dispatch_semaphore_create(_ value: Int) -> dispatch_semaphore_t !
    其中value为信号量的初值,如果小于0则会返回NULL

    提高信号量
    func dispatch_semaphore_signal(_ dsema: dispatch_semaphore_t!) -> Int
    函数将Dispatch_Semaphore的计数器加1

    等待降低信号量
    func dispatch_semaphore_wait(_ dsema: dispatch_semaphore_t!,
    _ timeout: dispatch_time_t) -> Int
    函数等待Dispatch Semaphore的计数值大于或者等于1,当满足条件时计数器执行减法,并从wait函数中返回

    ***当dispatch_semaphore_wait函数返回0时,可以安全地执行排他控制的处理
    注意,正常的使用顺序是先降低然后再提高,这两个函数通常成对使用。

    相关文章

      网友评论

          本文标题:GCD之dispatch_semaphore(信号量)

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