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