我不太确定在用户模式线程中使用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(比较和交换)。
答案 0 :(得分:2)
棘手。我会说 theory ,这段代码并不安全。如果没有内存屏障,则可以通过自旋锁移动您正在保护的数据访问。但是,只有在编译器非常积极地内联并且在此重新排序中才能看到目的时,才会执行此操作。
也许英特尔只是确定这个代码在所有当前编译器上工作,即使编译器理论上可以执行破坏此代码的转换,这些转换也不会加速程序,所以编译器可能不会这样做。
另一种可能性是,此代码仅用于隐式实现volatile
访问周围的内存屏障的编译器。 Microsoft的Visual C ++编译器(2005及更高版本)就是这样做的。您是否检查过它是否包含在#ifdef
块或类似内容中,仅在volatile
使用内存屏障的编译器上应用此实现?
答案 1 :(得分:0)
请注意,这是一个旋转等待而不是旋转锁。没有涉及写入操作。什么都没有获得。
如果您尝试添加写入操作以完成锁定过程,那么您将无法解决争用。