我可以使用互锁操作来更新多个值以避免锁定关键部分/互斥锁吗?

Gra*_*Lup 3 c++ multithreading synchronization interlocked-increment

我有一个多线程应用程序(C++),我需要增加/更改一系列值.如果我使用一系列互锁操作,它们被认为是单个原子操作吗?就像在这个例子中:

InterlockedIncrement(&value1);
InterlockedIncrement(&value2);
InterlockedExchange(&oldValue, newValue);
Run Code Online (Sandbox Code Playgroud)

或者我们更好地锁定以执行同步?像这样:

EnterCriticalSection(&cs);
value1++;
value2++;
oldValue = newValue;
LeaveCriticalSection(&cs);
Run Code Online (Sandbox Code Playgroud)

我认为需要一个锁定,但我不确定......所有的值要么处于旧状态,要么处于新状态,这一点非常重要.

aJ.*_*aJ. 14

InterlockedIncrement 本身是一个原子操作,但系列InterLockedIncrement不是原子的.如果您的要求是获得一系列操作的原子性,那么您可以使用临界区.

  • 要添加到此,请不要直接使用EnterCriticalSection和LeaveCriticalSection,因为在异常情况下可能不会调用LeaveCriticalSection.因此使用类CSingleLock将自动锁定和解锁关键部分. (2认同)