【问题标题】:Objective-C / Cocoa equivalent of C# ManualResetEventObjective-C / Cocoa 相当于 C# ManualResetEvent
【发布时间】:2010-11-08 21:00:20
【问题描述】:

是否有等效的 .NET ManualResetEvent 类可用于 Objective-C / Cocoa 中?

【问题讨论】:

    标签: objective-c cocoa multithreading


    【解决方案1】:

    我对 ManualResetEvent 不是很熟悉,但是 based on the documentation,看起来 the NSCondition class 可能就是你要找的东西。

    NSCondition 绝不是完全等价的,但它确实提供了类似的信号功能。您可能还想阅读NSLock

    【讨论】:

    • 阅读文档的这似乎完全符合我的需要。谢谢!
    • 看起来 NSCondition 更像是 AutoResetEvent 而不是 ManualResetEvent。
    • 查看这个有用的示例:stackoverflow.com/questions/6158397/…
    【解决方案2】:

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

    您可以使用 NSCondition 类,但我认为它更好
    直奔源头。以pthread_cond_init开头。

    你会喜欢的。

    【讨论】:

    • NSCondition 是围绕 pthread 的更高级别的包装器。如果 NSCondition/NSLock 接口可以完成这项工作,则无需进入低级。
    • 好吧,我想你可以用简单的方法来做。
    【解决方案3】:

    我会给你我昨天想找到的示例代码(但在任何地方都找不到)。如果你想创建一个消费者是异步的生产者/消费者类,这就是你需要做的:

    你需要声明和分配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。

    【讨论】:

      【解决方案4】:

      这是我创建的一个包装类,它使用 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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 2014-09-13
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多