认为:
A. WIN32下的C++。
B. 使用InterlockedIncrement()
和递增和递减的正确对齐的易失性整数InterlockedDecrement()
。
__declspec (align(8)) volatile LONG _ServerState = 0;
如果我只想读取_ServerState,是否需要通过InterlockedXXX
函数读取变量?
例如,我见过如下代码:
LONG x = InterlockedExchange(&_ServerState, _ServerState);
和
LONG x = InterlockedCompareExchange(&_ServerState, _ServerState, _ServerState);
目标是简单地读取 的当前值_ServerState
。
我不能简单地说:
if (_ServerState == some value)
{
// blah blah blah
}
WRT这个主题似乎有些混乱。我知道寄存器大小的读取在 Windows 中是原子的,所以我认为该InterlockedXXX
函数是不必要的。
马特·J。
好的,谢谢回复。顺便说一句,这是 Visual C++ 2005 和 2008。
如果这是真的,我应该使用一个InterlockedXXX
函数来读取 的值_ServerState
,即使只是为了清楚起见,最好的方法是什么?
LONG x = InterlockedExchange(&_ServerState, _ServerState);
这具有修改值的副作用,而我真正想做的就是读取它。不仅如此,如果有上下文切换,我可能会将标志重置为错误的值,因为 的值_ServerState
被压入堆栈以准备调用InterlockedExchange()
.
LONG x = InterlockedCompareExchange(&_ServerState, _ServerState, _ServerState);
我从我在 MSDN 上看到的一个例子中得到了这个。
请参阅http://msdn.microsoft.com/en-us/library/ms686355(VS.85).aspx
我所需要的只是一些类似的东西:
lock mov eax, [_ServerState]
无论如何,我认为很清楚的一点是提供对标志的线程安全访问,而不会产生关键部分的开销。我已经看到通过函数族以这种方式使用 LONG InterlockedXXX()
,因此我提出了问题。
好的,我们正在考虑一个很好的解决这个读取当前值问题的方法是:
LONG Cur = InterlockedCompareExchange(&_ServerState, 0, 0);