我需要先設置一個互斥鎖,然後再解鎖此請求在另一個線程上的回調中的互斥鎖。Objective C NSLock:在不同的線程上鎖定和解鎖NSLock
蘋果的文件說:
警告:NSLock類使用POSIX線程 實施其鎖定 行爲。當向NSLock對象發送解鎖消息 時,必須確保該消息是從發送初始鎖 消息的相同線程發送的 消息。解鎖來自 不同線程的鎖可導致 未定義的行爲。
如何避免這種「未定義的行爲」並使其按預期工作?
我需要先設置一個互斥鎖,然後再解鎖此請求在另一個線程上的回調中的互斥鎖。Objective C NSLock:在不同的線程上鎖定和解鎖NSLock
蘋果的文件說:
警告:NSLock類使用POSIX線程 實施其鎖定 行爲。當向NSLock對象發送解鎖消息 時,必須確保該消息是從發送初始鎖 消息的相同線程發送的 消息。解鎖來自 不同線程的鎖可導致 未定義的行爲。
如何避免這種「未定義的行爲」並使其按預期工作?
更好的是,使用NSOperationQueue
或GCD隊列作爲您的同步原語。
鎖是昂貴的和信號量,或多或少,與計數器的鎖。
基於隊列的編碼效率更高,特別是在使用內置排隊機制時。
請勿爲此使用互斥鎖。使用初始化爲1的信號量或其他允許跨線程通信/鎖定的鎖定機制。
RGDS, 馬丁
使用這個NSCondition
信號其他線程,他們現在可以安全地通過。
因此,在這種情況下,你建議使用maxConcurrentOperationCount = 1的NSOperationQueue?在這種情況下,只有一個操作被執行,並且不可能存在競爭條件 – Giuseppe