2011-11-22 67 views
1

我有一個iOS類,它在單獨的線程中進行一些計算,而主線程顯示允許用戶取消計算的提醒。計算線程使用幾個可從主線程和計算線程訪問的實例變量。計算線程只讀取這些變量,並且主線程在計算線程存在時不寫入或讀取這些變量。我需要使用NSLock嗎?

我的問題是,我需要鎖定這些變量?

回答

3

只要有一個線程可以訪問它們,不需要鎖定它們。儘管如此,嘗試這種做法可能是一種好的做法,如果您想從主線程訪問它們,那麼現在就做這件事會有好處。

+0

感謝您的回答。 「只要只有一個線程可以訪問它們...」我通過訪問來假設你的意思是閱讀。如果兩個線程都讀取變量是必需的鎖定?也許我更常見的問題是鎖是否可以用於超越同步的任何目的?我對線程有點新,並且已經看到關於線程陷阱的各種警告,所以我非常仔細地踩踏。 – user1060816

+0

如果所有線程*只讀*,不鎖定它不應該導致任何問題。如果任何一個線程寫入它,所有線程都應該鎖定它,以便讀取和寫入。 – Kevin

2

不,你沒有。您只需鎖定變量,如果它們將被一次寫入多個線程並從中讀取。

+3

這並不完全正確。如果您通過一個線程寫入變量並僅從另一個線程讀取變量,則仍然需要某種同步原語以確保您看到寫入。 –

+0

傻我。相應編輯 – twerdster

+0

很酷。顛倒了我的投票。 –

0

同意凱文,你應該計劃未來的變化,以防你需要訪問它們。

僅供參考,我不會使用警報,因爲它會阻止主視圖。我推薦一個活動指示器視圖以及一個允許它們取消的額外按鈕。

您可以在每個常規輸入控件(按鈕,分段控件等)中進行檢查以確保該應用程序「不處理」以接受輸入。

- (IBAction)someOtherButtonPressed:(id)sender { 
    if(processingFlag == NO) { 
    // allow handling of input 
    } 
    else { 
    // alert or other message indicating the app is processing 
    } 
}