我正在研究一個相對簡單的iPhone應用程序,該應用程序具有多輪定時器,並具有許多設置,例如輪次數和輪次長度。我們允許某些設置在定時器運行時進行設置,這意味着定時器可能正在讀取設置正在寫入的內存。沒有多個線程同時執行的代碼的關鍵部分,但來自設置的代碼可能正在嘗試寫入定時器正在讀取的內存。我的iPhone應用程序真的需要鎖定嗎?
在一個簡單的例子來說,假設我們的全局變量foo和有一個NSTimer方法,其看起來如下:
- (無效)timerTick { 的NSString * X = FOO; }
然後在設置代碼,我們這樣做的定時器運行時:
富= @「測試」;
在這個應用程序中使foo原子化還是需要某種鎖定方案?
謝謝。
「這是不必要的......」所產生的計時器被添加到主運行循環中。「不,不一定。它被添加到*當前運行循環中,即當前線程上的運行循環,它可能不是主線程**。 http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/clm/NSTimer/scheduledTimerWithTimeInterval:target:selector:userInfo:重複:http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSRunLoop_Class/Reference/Reference.html#//apple_ref/occ/clm/NSRunLoop/currentRunLoop – 2010-01-27 02:03:50
我認爲這是更符合你的意思:「......如果你自己沒有創建任何線程,那麼根本就不關心鎖定等。」這是正確的:如果你還沒有創建另一個線程,那麼主線程是當前線程,所以定時器將在主線程的運行循環*在這種情況下*。如果你想在線程上運行一個定時器,你必須自己創建線程,然後在該線程上創建和調度定時器。 (然後你將不得不考慮同步。) – 2010-01-27 02:06:13
是的,你完全正確,彼得。謝謝你指出。 – Yuji 2010-01-27 02:11:43