在我的Cocoa/iOS的應用程序,我有一個靜態double
變量(姑且稱之爲foo
),它必須是:可可:最輕量級的方式來同步訪問一個雙?
- 通過我的應用程序的一部分在後臺線程更新
- 由另一部分看我的在主線程上的應用程序
我正在尋找最輕量級的方式來同步訪問foo
。
注:我知道,在這些情況下,最簡單的解決方案通常是調整代碼,使得只有一個線程訪問變量,因此沒有同步是必要的。假設我已經確定在這種情況下限制foo
訪問單個線程是不可能的(可能在步驟中採取的動作發生得如此之快/通常不希望線程切換)。請不要回答「限制foo
訪問一個線程」的答案。我正在尋找替代品。
我現在的理解是,使用volatile
變量是同步訪問foo
最輕量級的方式。所以foo
聲明是這樣的:
static volatile double foo = 60.0;
後臺線程編寫代碼是一樣的東西:
foo = 90.0;
主線程讀取的代碼是一樣的東西:
double bar = 0.0;
bar = foo;
// use bar here …
一些問題:
- 主線程保證在後臺線程上寫入更新後的
foo
值(假設foo
被聲明爲volatile
)? IOW,我做了足夠的工作以確保兩個線程能夠看到對方的讀/寫操作的結果嗎? - 我假設在這種情況下,使用
volatile
作爲double
的值更快/更輕量級/更可取,而不是像@synchronized
塊或NSLock
那樣的互斥鎖。真的嗎? IOW,是volatile
這個特殊情況的最佳解決方案?
易失性不保證原子性。 – mkb
@mkb ...尤其是當標記爲易失性的想法大於機器字時,這可能就是這種情況。 –
@mkb真棒。好信息。如果那是真的,那麼我認爲在這種情況下volatile不會起作用。 –