2012-08-09 50 views
1

我有一個函數接受一個整數指針作爲參數,然後它改變。我有幾個在不同線程上運行的函數實例 - 一些與參數具有相同的整數。你如何防止訪問互相訪問的變量?

我需要的,如果該參數是由函數的另一個實例上的另一個線程正在改變暫停功能的情況下,當其他實例已經完成改變變量恢復。

看似明顯的解決方案,爲這類問題將是一個NSLock或POSIX互斥,但是這會妨礙功能的所有情況持續,即使整數參數是不同的。

對於我的意思考慮一個更直觀的想法如下:

void theFunction (int *argument) 
{ 
    NSLock *theLock = [NSLock new]; 
    [theLock lock]; 

    (*argument) ++; 

    [theLock unlock]; 
} 

上面的代碼將防止功能的所有情況下運行,但我只需要暫停功能的情況下,整數參數是相同。我怎樣才能鎖定變量,以暫停試圖讀取或寫入它的任何實例,直到它被解鎖?

+0

有多少不同的值將在整型變量有哪些? – 2012-08-09 20:24:17

+0

OK,編輯,使這個問題更有意義,但'*參數++的運算符優先級'是錯誤的(並且該空間誤導)。 – 2012-08-09 20:28:14

+1

編輯完成後,我不得不刪除我的答案,因爲事情並不像我希望的那麼簡單。本地鎖的問題仍然存在。難道真的有意義的基礎上,而不是地址'*'argument'的argument'價值授予訪問權限(如ISTM它的位置被指出,這是保護,值得資源)?也許,你應該在這裏提供更多的上下文。 – Dirk 2012-08-09 20:41:49

回答

1

如果你有INT *,可以考慮使用單位遞增操作(見男子OSAtomicAdd32)。你想要的每個值都是非常便宜的。

0

使用每個參數單獨的鎖?