【发布时间】:2010-11-08 21:00:20
【问题描述】:
是否有等效的 .NET ManualResetEvent 类可用于 Objective-C / Cocoa 中?
【问题讨论】:
标签: objective-c cocoa multithreading
是否有等效的 .NET ManualResetEvent 类可用于 Objective-C / Cocoa 中?
【问题讨论】:
标签: objective-c cocoa multithreading
我对 ManualResetEvent 不是很熟悉,但是 based on the documentation,看起来 the NSCondition class 可能就是你要找的东西。
NSCondition 绝不是完全等价的,但它确实提供了类似的信号功能。您可能还想阅读NSLock。
【讨论】:
啊,这些都是穷人的条件变量。
您可以使用 NSCondition 类,但我认为它更好
直奔源头。以pthread_cond_init开头。
你会喜欢的。
【讨论】:
我会给你我昨天想找到的示例代码(但在任何地方都找不到)。如果你想创建一个消费者是异步的生产者/消费者类,这就是你需要做的:
你需要声明和分配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。
【讨论】:
这是我创建的一个包装类,它使用 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
我只做了一些基本的测试,但我认为它应该用更少的仪式来完成工作。
【讨论】: