它们都使用计数器并使用锁来保护计数器的递增和递减,当计数器小于零时,线程等待。在我看来,除了他们的api,他们是相同的。
答案 0 :(得分:0)
Apple在其关于DispatchSemaphore
signal()
方法的文档中写道:
此函数唤醒当前在dispatch_semaphore_wait(: :)中等待的线程。
与DispatchSemaphore
不同,NSCondition
有两种不同的方法:
1)broadcast()
:
发出信号,唤醒等待它的所有线程。
2)signal()
发出信号,唤醒一个等待它的线程。
答案 1 :(得分:0)
我认为分派信号量是一个更高级别的概念,如果不需要,它不一定涉及锁定,而 NSCondition 是 pthread 条件的包装器,因此始终涉及线程级别的锁定。
调度信号量与调度队列协同工作,并不是每个调度队列都必须在不同的线程上(因为使用了线程池)。
必须以经典方式使用 NSCondition,包括以下步骤:
在等待方面:
在信令/广播方面:
演示 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
分派信号量的使用要简单得多,因为您不需要锁定它,并且可以直接将其用作谓词。它只是作为一个计数器,每次等待减少其值,每个信号增加它。对于需要额外锁的更复杂的谓词,它的使用可能会受到限制。
来自文档:
<块引用>调度信号量是传统信号量的有效实现 计数信号量。分派信号量只调用内核 当调用线程需要被阻塞时。如果调用信号量 不需要阻塞,不进行内核调用。