我有一个多线程应用程序(C ++),我需要增加/更改一系列值。 如果我使用一系列互锁操作,它们被认为是单个原子操作吗?就像在这个例子中一样:
InterlockedIncrement(&value1);
InterlockedIncrement(&value2);
InterlockedExchange(&oldValue, newValue);
或者我们锁定以执行同步会更好吗?像这样:
EnterCriticalSection(&cs);
value1++;
value2++;
oldValue = newValue;
LeaveCriticalSection(&cs);
我认为需要锁定,但我不确定......所有值都处于旧状态或新状态中非常重要。
答案 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)
你是对的,因为所有的价值要么处于旧状态,要么处于旧状态,或者是新状态。你应该使用关键部分