【发布时间】:2018-12-17 16:57:52
【问题描述】:
这仅与 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;
也就是说,在多 CPU 系统上,当 thread 1 正在执行锁定的 InterlockedExchange 指令时,其他一些线程开始执行 vFlags = 2 和 vFlags = 4 指令。
在这种情况下会发生什么? vFlags = 2 和 vFlags = 4 会停止直到 InterlockedExchange 完成,还是会忽略该锁定?
或者我需要改用这个吗?
//Thread N
InterlockedOr(&vFlags, SomeNonZeroValue);
【问题讨论】:
-
如果您没有内存屏障/同步 - 线程不能保证看到更改。
-
@zerkms 你能提供更多关于
memory barriers是什么的信息吗? -
preshing.com/20120710/… 基本上该博客中有一半的文章是相关的
-
@zerkms:谢谢。不错的文章。据它说,微软的Interlocked functions 实现了这些围栏。
-
Interlocked 确实会,但
vFlags = SomeNonZeroValue;不会。
标签: c windows multithreading visual-studio multicore