【问题标题】:What's the difference between NSCondition and dispatch_semaphore in iOS except their API?除了 API 之外,iOS 中的 NSCondition 和 dispatch_semaphore 有什么区别?
【发布时间】:2017-09-04 12:29:55
【问题描述】:

它们都使用计数器,并使用锁来保护计数器的递增和递减,当计数器小于零时,线程等待。在我看来,除了它们的 api 之外,它们是相同的。

【问题讨论】:

    标签: ios synchronization semaphore nscondition


    【解决方案1】:

    Apple 在他们的文档中写到 DispatchSemaphore signal() 方法:

    此函数唤醒当前在 dispatch_semaphore_wait(::) 中等待的线程。

    DispatchSemaphore 不同,NSCondition 有两种不同的方法:

    1)broadcast():

    发出条件信号,唤醒所有等待它的线程。

    2)signal()

    发出条件信号,唤醒一个等待它的线程。

    【讨论】:

      【解决方案2】:

      我认为调度信号量是一个更高级别的概念,如果不需要,不一定涉及锁定,而 NSCondition 是 pthread 条件的包装器,因此总是涉及线程级别的锁定。

      调度信号量与调度队列协同工作,并不是每个调度队列都必须在不同的线程上(因为使用了线程池)。

      必须以经典方式使用 NSCondition,包括以下步骤:

      在等待方面:

      • 锁定条件
      • 在while循环中,检查谓词并等待条件
      • 解锁条件

      在信令/广播方面:

      • 锁定条件
      • 更改会更改谓词的基础值
      • 信号/广播状态
      • 解锁条件

      展示 NSCondition (Objective C) 用法的示例类别:

      @implementation NSCondition(Extension)
      
      - (void)signalPredicateModification:(void (NS_NOESCAPE ^)(void))predicateModification {
          @try {
              [self lock];
              predicateModification();
              [self signal];
          } @finally {
              [self unlock];
          }
      }
      
      - (void)waitForPredicate:(BOOL (NS_NOESCAPE ^)(void))predicate {
          @try {
              BOOL predicateResult = NO;
              [self lock];
              while (!(predicateResult = predicate())) {
                  [self wait];
              }
          } @finally {
              [self unlock];
          }
      }
      
      @end
      

      调度信号量的使用要简单得多,因为您不需要锁定它,并且可以直接将其用作谓词。它只是充当一个计数器,每次等待都会减少它的值,而每个信号都会增加它。对于需要额外锁的更复杂的谓词,它的使用可能会受到限制。

      来自文档:

      调度信号量是传统的有效实现 计数信号量。调度信号量只调用内核 当调用线程需要被阻塞时。如果调用信号量 不需要阻塞,不进行内核调用。

      【讨论】:

        猜你喜欢
        • 2014-08-23
        • 2017-11-23
        • 1970-01-01
        • 2014-04-20
        • 2017-12-29
        • 2019-03-18
        • 1970-01-01
        • 2015-11-07
        • 2020-08-13
        相关资源
        最近更新 更多