我需要先设置一个互斥锁,然后再解锁此请求在另一个线程上的回调中的互斥锁。Objective C NSLock:在不同的线程上锁定和解锁NSLock
苹果的文件说:
警告:NSLock类使用POSIX线程 实施其锁定 行为。当向NSLock对象发送解锁消息 时,必须确保该消息是从发送初始锁 消息的相同线程发送的 消息。解锁来自 不同线程的锁可导致 未定义的行为。
如何避免这种“未定义的行为”并使其按预期工作?
我需要先设置一个互斥锁,然后再解锁此请求在另一个线程上的回调中的互斥锁。Objective C NSLock:在不同的线程上锁定和解锁NSLock
苹果的文件说:
警告:NSLock类使用POSIX线程 实施其锁定 行为。当向NSLock对象发送解锁消息 时,必须确保该消息是从发送初始锁 消息的相同线程发送的 消息。解锁来自 不同线程的锁可导致 未定义的行为。
如何避免这种“未定义的行为”并使其按预期工作?
更好的是,使用NSOperationQueue
或GCD队列作为您的同步原语。
锁是昂贵的和信号量,或多或少,与计数器的锁。
基于队列的编码效率更高,特别是在使用内置排队机制时。
请勿为此使用互斥锁。使用初始化为1的信号量或其他允许跨线程通信/锁定的锁定机制。
RGDS, 马丁
使用这个NSCondition
信号其他线程,他们现在可以安全地通过。
因此,在这种情况下,你建议使用maxConcurrentOperationCount = 1的NSOperationQueue?在这种情况下,只有一个操作被执行,并且不可能存在竞争条件 – Giuseppe