2011-06-23 92 views
4

我需要先設置一個互斥鎖,然後再解鎖此請求在另一個線程上的回調中的互斥鎖。Objective C NSLock:在不同的線程上鎖定和解鎖NSLock

蘋果的文件說:

警告:NSLock類使用POSIX線程 實施其鎖定 行爲。當向NSLock對象發送解鎖消息 時,必須確保該消息是從發送初始鎖 消息的相同線程發送的 消息。解鎖來自 不同線程的鎖可導致 未定義的行爲。

如何避免這種「未定義的行爲」並使其按預期工作?

回答

6

更好的是,使用NSOperationQueue或GCD隊列作爲您的同步原語。

鎖是昂貴的和信號量,或多或少,與計數器的鎖。

基於隊列的編碼效率更高,特別是在使用內置排隊機制時。

+0

因此,在這種情況下,你建議使用maxConcurrentOperationCount = 1的NSOperationQueue?在這種情況下,只有一個操作被執行,並且不可能存在競爭條件 – Giuseppe

3

請勿爲此使用互斥鎖。使用初始化爲1的信號量或其他允許跨線程通信/鎖定的鎖定機制。

RGDS, 馬丁

3

使用這個NSCondition信號其他線程,他們現在可以安全地通過。