什么高级同步构造应该用于线程安全的单击方法?

时间:2013-12-08 23:20:44

标签: objective-c multithreading cocoa concurrency

我遇到的情况是后台处理会话可以通过超时,用户异步取消或会话完成来完成。任何这些完成事件都可以运行单次完成方法。完成方法只能运行一次。假设会话是对象的实例,因此任何同步都必须使用实例构造。

目前我正在对完成状态变量使用Atomic Compare和Swap操作,以便每个事件可以在运行时测试并设置完成状态。要触发的第一个完成事件将设置完成状态并运行单击方法,其余事件将失败。这很好用。

然而,我不禁感到我应该能够以更高层次的方式做到这一点。我尝试使用一个Lock对象(NSLock,因为我用Cocoa编写了这个),但后来得到一个警告,我正在释放一个仍然处于锁定状态的锁。这就是我想要的。锁被锁定一次并且从未解锁,但我担心代表锁的系统资源可能会被泄露。

无论如何,我只是对是否有人知道更高级别的方法来实现这样的单拍方法感兴趣。

任何完成事件的示例代码:

if(OSAtomicCompareAndSwapInt(0, 1, &completed))
{
    self.completionCallback();
}

1 个答案:

答案 0 :(得分:0)

做CAS几乎肯定是正确的做法。锁不是为你需要的设计的,它们可能要贵得多,而且在语义上也是一个不好的匹配 - 完成不是“锁定”。这是“完成”。布尔标志是正确的表示,并且执行CAS可确保在并发方案中安全地操作它。在C ++中,我会使用std::atomic_flag,也许检查Cocoa是否有类似的东西(这只是将CAS包装在一个更好的界面中,这样你就不会意外地对变量使用非CAS测试,这会很生气。

(编辑:在pthreads中,有一个名为pthread_once的函数可以做你想要的,但是我不知道Cocoa;在我看来,pthread_once界面无论如何都很笨重。 。)