我有一個iOS類,它在單獨的線程中進行一些計算,而主線程顯示允許用戶取消計算的提醒。計算線程使用幾個可從主線程和計算線程訪問的實例變量。計算線程只讀取這些變量,並且主線程在計算線程存在時不寫入或讀取這些變量。我需要使用NSLock嗎?
我的問題是,我需要鎖定這些變量?
我有一個iOS類,它在單獨的線程中進行一些計算,而主線程顯示允許用戶取消計算的提醒。計算線程使用幾個可從主線程和計算線程訪問的實例變量。計算線程只讀取這些變量,並且主線程在計算線程存在時不寫入或讀取這些變量。我需要使用NSLock嗎?
我的問題是,我需要鎖定這些變量?
只要有一個線程可以訪問它們,不需要鎖定它們。儘管如此,嘗試這種做法可能是一種好的做法,如果您想從主線程訪問它們,那麼現在就做這件事會有好處。
不,你沒有。您只需鎖定變量,如果它們將被一次寫入多個線程並從中讀取。
同意凱文,你應該計劃未來的變化,以防你需要訪問它們。
僅供參考,我不會使用警報,因爲它會阻止主視圖。我推薦一個活動指示器視圖以及一個允許它們取消的額外按鈕。
您可以在每個常規輸入控件(按鈕,分段控件等)中進行檢查以確保該應用程序「不處理」以接受輸入。
- (IBAction)someOtherButtonPressed:(id)sender {
if(processingFlag == NO) {
// allow handling of input
}
else {
// alert or other message indicating the app is processing
}
}
感謝您的回答。 「只要只有一個線程可以訪問它們...」我通過訪問來假設你的意思是閱讀。如果兩個線程都讀取變量是必需的鎖定?也許我更常見的問題是鎖是否可以用於超越同步的任何目的?我對線程有點新,並且已經看到關於線程陷阱的各種警告,所以我非常仔細地踩踏。 – user1060816
如果所有線程*只讀*,不鎖定它不應該導致任何問題。如果任何一個線程寫入它,所有線程都應該鎖定它,以便讀取和寫入。 – Kevin