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

时间:2010-04-22 12:37:26

标签: 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(比较和交换)。

2 个答案:

答案 0 :(得分:2)

棘手。我会说 theory ,这段代码并不安全。如果没有内存屏障,则可以通过自旋锁移动您正在保护的数据访问。但是,只有在编译器非常积极地内联并且在此重新排序中才能看到目的时,才会执行此操作。

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

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

答案 1 :(得分:0)

请注意,这是一个旋转等待而不是旋转。没有涉及写入操作。什么都没有获得。

如果您尝试添加写入操作以完成锁定过程,那么您将无法解决争用。