除了API之外,iOS中的NSCondition和dispatch_semaphore有什么区别?

时间:2017-04-09 12:21:27

标签: ios synchronization semaphore nscondition

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

2 个答案:

答案 0 :(得分:0)

Apple在其关于DispatchSemaphore signal()方法的文档中写道:

  

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

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

1)broadcast()

  

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

2)signal()

  

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

答案 1 :(得分:0)

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

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

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

在等待方面:

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

在信令/广播方面:

  • 锁定条件
  • 改变将改变谓词的基础值
  • 信号/广播条件
  • 解锁条件

演示 NSCondition 用法的示例类别(目标 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

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

来自文档:

<块引用>

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

相关问题