2

我不太确定在用户模式线程中旋转 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(比较和交换)。

4

2 回答 2

2

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

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

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

于 2010-04-22T13:43:06.790 回答
1

请注意,这是自旋等待,而不是自旋。不涉及写操作。什么都得不到。

如果您尝试添加写入操作来完成锁定过程,您将遇到无法解决的竞争。

于 2010-04-22T13:51:27.087 回答