2011-06-23 57 views
4

我需要先设置一个互斥锁,然后再解锁此请求在另一个线程上的回调中的互斥锁。Objective C NSLock:在不同的线程上锁定和解锁NSLock

苹果的文件说:

警告:NSLock类使用POSIX线程 实施其锁定 行为。当向NSLock对象发送解锁消息 时,必须确保该消息是从发送初始锁 消息的相同线程发送的 消息。解锁来自 不同线程的锁可导致 未定义的行为。

如何避免这种“未定义的行为”并使其按预期工作?

回答

6

更好的是,使用NSOperationQueue或GCD队列作为您的同步原语。

锁是昂贵的和信号量,或多或少,与计数器的锁。

基于队列的编码效率更高,特别是在使用内置排队机制时。

+0

因此,在这种情况下,你建议使用maxConcurrentOperationCount = 1的NSOperationQueue?在这种情况下,只有一个操作被执行,并且不可能存在竞争条件 – Giuseppe

3

请勿为此使用互斥锁。使用初始化为1的信号量或其他允许跨线程通信/锁定的锁定机制。

RGDS, 马丁

3

使用这个NSCondition信号其他线程,他们现在可以安全地通过。