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

时间:2009-06-11 20:01:58

标签: c++ multithreading synchronization interlocked-increment

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

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

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

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

我认为需要锁定,但我不确定......所有值都处于旧状态或新状态中非常重要。

5 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:4)

如果必须完全执行这些值以保持一致状态,则需要使用临界区。例如,如果您的值实际上类似于

   President = Barack Obama;
   VP = Joe Biden;
如果你在执行这些陈述之间有某种中断或上下文切换,那么你可能会遇到Barack Obama被任命为总裁而Dick Cheney是副总裁的情况。这种状态不一致我想我们都会同意:)

但是,如果您正在做类似

的事情
   Debit $5 from account;
   Credit $2 to account;

并且每个操作的结果都保持完整状态,互锁将很好。

答案 2 :(得分:1)

你应该使用临界区来确保原子性。

答案 3 :(得分:1)

你必须定义“状态”是什么。看起来你想让所有三个变量原子地改变 - 在这种情况下,三个单独的原子是不够的。但是如果你可以将所有状态分组到某种对象中,你应该能够使用“交换指针”技术来更新状态。

答案 4 :(得分:1)

你是对的,因为所有的价值要么处于旧状态,要么处于旧状态,或者是新状态。你应该使用关键部分