2009-07-07 74 views

回答

8

我对ManualResetEvent不是很熟悉,但是based on the documentation,它看起来像the NSCondition class可能是您正在寻找的。

NSCondition绝不意味着完全相同,但它的确提供了类似的信号功能。您可能还想阅读NSLock

+1

阅读文档的这似乎是做我所需要的。谢谢! – Lounges 2009-07-07 23:19:00

+0

它看起来像NSCondition更像是AutoResetEvent而不是ManualResetEvent。 – Brett 2013-01-25 03:50:13

0

啊,那些是穷人的条件变量。

你可以使用NSCondition类,但我认为它是更好的
直接来源。从pthread_cond_init开始。

你会喜欢它。

1

我给你我希望昨天找到的示例代码(但无法在任何地方找到)。如果要创建消费者异步的生产者/消费者类,则需要执行以下操作:

您需要声明并分配NSConditionLock。

NSArray * data = [self getSomeData]; 

if ([data count] == 0) { 
    NSLog(@"sendThread: Waiting..."); 
    [_conditionLock lockWhenCondition:1]; 
    [_conditionLock unlockWithCondition:0]; 
    NSLog(@"sendThread: Back to life..."); 
} 
else { 
    // Processing 
} 

,并在主代码,当您添加数据,你要解锁其他线程,你只需要添加:

[_conditionLock lock]; 
[_conditionLock unlockWithCondition:1]; 

注:我没有在这里描述数据是如何在生产者和消费者之间进行交换。在我的程序中,它正在经历一个SQLite/CoreData数据库,所以线程同步在更高层次完成。但是如果你使用NSMutableDictionary,你需要添加一些NSLock。

0

这是我创建的包装类,它使用NSCondition模拟ManualResetEvent。

@interface WaitEvent : NSObject { 
    NSCondition *_condition; 
    bool _signaled; 
} 

- (id)initSignaled:(BOOL)signaled; 
- (void)waitForSignal; 
- (void)signal; 

@end 

@implementation WaitEvent 

- (id)initSignaled:(BOOL)signaled 
{ 
    if (self = ([super init])) { 
     _condition = [[NSCondition alloc] init]; 
     _signaled = signaled; 
    } 

    return self; 
} 

- (void)waitForSignal 
{ 
    [_condition lock]; 
    while (!_signaled) { 
     [_condition wait]; 
    } 

    [_condition unlock]; 
} 

- (void)signal 
{ 
    [_condition lock]; 
    _signaled = YES; 
    [_condition signal]; 
    [_condition unlock]; 
} 

@end 

我已经做了一些基本的测试,但我认为应该用更少的仪式完成工作。