这仅涉及Microsoft/Visual Studio和Intel/AMD特定的实现。
比如说,如果声明一个全局变量:
volatile __declspec(align(16)) ULONG vFlags = 0;
而且,比如说,我有多个竞争线程:
//Thread 1
ULONG prevFlags;
prevFlags = InterlockedExchange(&vFlags, 0);
if(prevFlags != 0)
{
//Do work
}
然后从其他线程,我做:
//Thread N
vFlags = SomeNonZeroValue;
thread 1也就是说,在多CPU系统上,在执行锁定指令的时刻InterlockedExchange,其他一些线程来执行vFlags = 2指令vFlags = 4。
在那种情况下会发生什么?在完成之前会一直停滞不前,vFlags = 2还是会忽略该锁定?vFlags = 4InterlockedExchange
还是我需要改用它?
//Thread N
InterlockedOr(&vFlags, SomeNonZeroValue);