3

我有一個多線程應用程序(C++),我需要增加/更改一系列值。 如果我使用一系列互鎖操作,它們是否被認爲是單個原子操作?像這樣的例子:我可以使用互鎖操作更新多個值以避免鎖定臨界區/互斥量嗎?

InterlockedIncrement(&value1); 
InterlockedIncrement(&value2); 
InterlockedExchange(&oldValue, newValue); 

或者它會更好地執行同步?就像這樣:

EnterCriticalSection(&cs); 
value1++; 
value2++; 
oldValue = newValue; 
LeaveCriticalSection(&cs); 

我覺得需要一個鎖,但我不知道......所有的值是無論是在舊的國家,還是在新的,一起是非常重要的。

回答

14

InterlockedIncrement本身是一個原子操作,但系列InterLockedIncrement不原子在一起。如果您的要求是獲得一系列操作的原子性,那麼您可以使用臨界區。

+2

要添加到此,請勿直接使用EnterCriticalSection&LeaveCriticalSection,因爲如果發生異常,LeaveCriticalSection可能不會被調用。因此,使用CSingleLock類將自動爲您鎖定和解鎖關鍵部分。 – Naveen 2009-06-12 05:03:34

1

您應該使用臨界區來確保原子性。

4

如果必須完全執行這些值才能保持一致的狀態,則需要使用臨界區。例如,如果你的價值觀實際上是類似

President = Barack Obama; 
    VP = Joe Biden; 

,你沒有使用一個關鍵部分,你可能會在奧巴馬置於總統和切尼副總裁是如果你有一些情況執行這些語句之間的中斷或上下文切換。這種狀態不一致,我想大家都會同意:)

不過,如果你正在做的事情一樣

Debit $5 from account; 
    Credit $2 to account; 

和每個操作的結果,留下了一個完整的狀態,聯鎖將被罰款。

+1

+1這個不錯的例子.. – Naveen 2009-06-12 05:05:47

1

你必須定義「狀態」是什麼。看起來你希望所有三個變量都是原子變化的 - 在這種情況下,三個單獨的原子是不夠的。但是,如果可以將所有狀態組合到某種對象中,則應該可以使用「交換指針」技術來更新狀態。

1

你是對的,因爲所有的價值觀都是舊狀態或新狀態,您應該使用關鍵部分