3

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

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

还是给我们一个锁来执行同步会更好?像这样:

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

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

4

5 回答 5

14

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

于 2009-06-11T20:07:23.883 回答
4

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

   President = Barack Obama;
   VP = Joe Biden;

并且您没有使用关键部分,如果您在执行这些语句之间存在某种中断或上下文切换,您可能会处于巴拉克奥巴马被任命为总统而迪克切尼是副总裁的情况。这种状态是不一致的,我想我们都会同意 :)

但是,如果你正在做类似的事情

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

并且每次操作的结果都留下了一个完整的状态,联锁就可以了。

于 2009-06-11T20:09:56.870 回答
1

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

于 2009-06-11T20:09:50.430 回答
1

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

于 2009-06-11T20:10:52.190 回答
1

你是对的,因为所有值要么处于旧状态,要么处于新状态;你应该使用临界区

于 2009-06-11T20:11:30.860 回答