gpt4 book ai didi

c - 尝试理解 Interlocked* 函数

转载 作者:行者123 更新时间:2023-11-30 14:47:26 25 4
gpt4 key购买 nike

这仅涉及 Microsoft/Visual StudioIntel/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 系统上,当线程 1 正在执行锁定的 InterlockedExchange 指令时,其他一些线程开始执行vFlags = 2vFlags = 4 指令。

这种情况下会发生什么? vFlags = 2vFlags = 4 会停止直到 InterlockedExchange 完成,还是会忽略该锁?

或者我需要使用这个吗?

//Thread N
InterlockedOr(&vFlags, SomeNonZeroValue);

最佳答案

不使用锁来更新变量的指令不会与使用锁的指令交互。锁定是一个合作过程,所有参与者都必须遵守它才能发挥作用。因此,是的,在一个线程上通过简单的赋值更新标志不会被调用 InterlockedExchange 的另一个线程阻塞。

另一方面,为其他线程读取的变量分配不同的值会引发跨内核的可见性问题,因为其他线程可能不会立即或实际上永远不会看到更新。 InterlockedExchange 通过提供隐式内存栅栏也解决了这个问题。

总之,我将在更新标志的所有线程中使用 InterlockedExchange

关于c - 尝试理解 Interlocked* 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51255189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com