2010-12-08 55 views
2

我正在爲iPhone編寫併發應用程序。 我不知道如果這個代碼:在循環中阻塞相當於空的互斥鎖?

while(!conditionBoolean) 
{ 
    // do nothing 
    // until another thread makes this variable true. 
} 

makeWork(); 

等同於以下內容:

[lock lock];  // this lock is locked by another thread 
        // causing the current to block until it's unlocked 

[lock unlock]; 
makeWork(); 

如果不是,有什麼區別?

謝謝。

回答

6

你應該更喜歡第二個,第一個會產生一個緊密的循環和延遲,或者甚至可能阻止變量以你想要的方式設置。至少你必須在這個循環中引入延遲,這是一種睡眠。

更好的辦法是等待信號原語完成工作,然後由其他線程發送信號 - 設計是確定性的,與取決於某個其他線程可能鎖定的互斥鎖或狀態變量在獲得機會之前進行修改。一般來說,多線程設計最好是事件驅動(push模型),而不是機會性地檢查共享狀態(拉模型)。

+0

謝謝史蒂夫!你能給出一個信令原語的例子嗎? – wh1t3cat1k 2010-12-08 16:46:05

+0

例如。 `NSConditionLock` - 請參閱http://objc.toodarkpark.net/Foundation/Classes/NSConditionLock.html – 2010-12-08 16:50:03

1

我對互斥鎖的理解是鎖可以在較少的週期內發生,例如,當您讀取conditionboolean成爲true時,有可能另一個線程在讀取它時仍然可以將其更改爲true ,而另一個在再次閱讀之前會變成錯誤的。這變成了競爭狀態,互斥鎖將希望避免。如果你有許多具有類似while循環的函數,這也可能導致你的代碼不成爲「下一個行」。