首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSCondition和dispatch_semaphore在iOS中除了它们的接口之外还有什么区别?

NSCondition和dispatch_semaphore在iOS中除了它们的接口之外还有什么区别?
EN

Stack Overflow用户
提问于 2017-04-09 20:21:27
回答 2查看 599关注 0票数 4

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

EN

回答 2

Stack Overflow用户

发布于 2018-01-18 16:40:23

苹果在他们关于DispatchSemaphore signal()方法的文档中写道:

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

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

1) broadcast()

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

2) signal()

用信号通知这个条件,唤醒一个等待它的线程。

票数 0
EN

Stack Overflow用户

发布于 2021-02-15 16:46:51

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

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

必须以经典的方式使用NSCondition,这涉及到以下步骤:

在等待方面:

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

  • unlock

在信令/广播方面:

锁定会更改predicate

  • signal/broadcast condition

  • change condition

  • unlock

的基础值

演示NSCondition用法的示例类别(目标C):

代码语言:javascript
复制
@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

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

从文档中:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43306625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档