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

标签 c++ concurrency volatile tbb spinlock

我不太确定在用户模式线程中旋转 volatile 变量是否安全,以实现轻量级 spin_lock,我查看了 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 类中没有栅栏。而从其他用户模式 ​​spin_lock 实现来看,大多数都使用 CAS(比较和交换)。

最佳答案

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

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

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

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

相关文章:

c# - 具有 volatile 或锁定的属性

java - 空的 synchronized(this){} 对线程之间的内存可见性有什么意义吗?

c++ - Qt QSqlQuery 准备和 bindValue 不工作

C++ 在配置之间切换的最佳方式

C++ 多线程共享资源

c++ - 排序自定义容器

c - nanosleep(),usleep()中产生CPU所需的最短时间量

java - 在 Java 中并行执行代码

java - Hibernate/JPA版本并发控制和DTO/更改命令模式