gpt4 book ai didi

c++ - 在用户模式线程中旋转 volatile 变量是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:42 26 4
gpt4 key购买 nike

我不太确定在用户模式线程中自旋 volatile 变量是否安全,以实现轻量级自旋锁,我查看了 tbb 源代码,tbb_machine.h:170,

//! Spin WHILE the value of the variable is equal to a given value
/** T and U should be comparable types. */
template<typename T, typename U>
void spin_wait_while_eq( const volatile T& location, U value ) {
atomic_backoff backoff;
while( location==value ) backoff.pause();
}

正如我所见,atomic_backoff 类中没有栅栏。而从其他用户模式自旋锁实现来看,它们大多使用 CAS(比较和交换)。

最佳答案

棘手。我会说,在理论上,这段代码并不安全。如果没有内存屏障,那么您保护的数据访问可以通过自旋锁移动。但是,只有当编译器非常积极地内联并且可以在这种重新排序中看到目的时才会这样做。

也许英特尔只是确定这段代码可以在所有当前的编译器上运行,并且即使编译器理论上可以执行会破坏这段代码的转换,但这些转换不会加速程序,因此编译器可能不会这样做。

另一种可能性是此代码仅用于隐式实现围绕 volatile 访问的内存屏障的编译器。 Microsoft 的 Visual C++ 编译器(2005 及更高版本)执行此操作。您是否检查过它是否包含在 #ifdef block 或类似 block 中,仅在 volatile 使用内存屏障的编译器上应用此实现?

关于c++ - 在用户模式线程中旋转 volatile 变量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2690773/

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