Objective C NSLock:在不同的线程上锁定和解锁NSLock

时间:2011-06-23 15:56:22

标签: objective-c multithreading cocoa macos thread-safety

我需要在创建异步请求之前设置一个互斥锁,然后在另一个线程上的此请求的回调中解锁互斥锁。

Apple文档说:

  

警告:NSLock类使用POSIX   线程实现其锁定   行为。发送解锁时   消息到NSLock对象,您必须   确保从该邮件发送消息   发送初始锁的同一个线程   信息。解锁一个锁   不同的线程可以导致   未定义的行为。

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

3 个答案:

答案 0 :(得分:6)

更好;使用NSOperationQueue或GCD队列作为同步原语。

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

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

答案 1 :(得分:3)

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

RGDS, 马丁

答案 2 :(得分:3)

使用NSCondition来表示他们现在可以安全通过的其他线程。