它们都使用计数器并使用锁来保护计数器的递增和递减,当计数器小于零时,线程等待。在我看来,除了它们的api之外,它们是相同的。
发布于 2018-01-18 16:40:23
苹果在他们关于DispatchSemaphore signal()方法的文档中写道:
此函数唤醒当前在dispatch_semaphore_wait(:)中等待的线程。
与DispatchSemaphore不同,NSCondition有两种不同的方法:
1) broadcast()
发出条件信号,唤醒等待它的所有线程。
2) signal()
用信号通知这个条件,唤醒一个等待它的线程。
发布于 2021-02-15 16:46:51
我认为分派信号量是一个更高级别的概念,如果不需要,它不一定需要锁定,而NSCondition是pthread条件的包装器,因此总是涉及线程级别的锁定。
分派信号量与分派队列协同工作,并不是每个分派队列都必须位于不同的线程上(因为使用了线程池)。
必须以经典的方式使用NSCondition,这涉及到以下步骤:
在等待方面:
在while循环中锁定条件和条件,检查谓词并等待condition
在信令/广播方面:
锁定会更改predicate
的基础值
演示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分派信号量的用法要简单得多,因为您不需要锁定它,并且可以直接将它用作谓词。它只是一个计数器,每次等待都会减少它的值,而每个信号会增加它的值。对于更复杂的谓词,它的使用可能会受到限制,对于这些谓词,需要额外的锁。
从文档中:
分派信号量是传统计数信号量的有效实现。只有当调用线程需要被阻塞时,调度信号量才会向下调用内核。如果调用信号量不需要阻塞,则不进行内核调用。
https://stackoverflow.com/questions/43306625
复制相似问题