【发布时间】:2011-12-16 19:00:56
【问题描述】:
一个布尔标志由两个线程切换。下面的代码有意义吗?
static bool ATOMIC_BOOL_READ( volatile bool& var )
{
return __sync_fetch_and_or(&var, 0);
}
static void ATOMIC_BOOL_WRITE(volatile bool& var, bool newval )
{
__sync_bool_compare_and_swap( &var, !newval, newval);
}
注意几点:
我正在传递一个布尔引用。有意义吗?
为了踢球,我还宣布它是易变的。
- 函数是静态的
更新:
我想问的基本问题是: 原子性和内存屏障有什么区别?如果线程 A 正在对变量 foo 执行 atomic builtin,那么线程 B 不能对变量 foo 执行任何操作;因此创建了内存屏障?
【问题讨论】:
-
声明一个函数参数
volatile没有多大意义,因为它已经通过在堆栈上分配而被限制在一个线程中。 -
以上评论有误。 var 不在堆栈中...
-
@AdamZalcman 这是对
volatile的引用。但这可能没有必要。如果这两个__sync函数按预期工作,那么应该没有任何问题,volatile或没有。如果他们不这样做,volatile可能无济于事。 -
我看不到 bool 变量的声明位置,它可能是在堆上分配的。并且线程堆栈上的局部变量绝不是“受限”的,只要您获取地址或将其作为引用传递给另一个线程,它可能会很好地从“外部”更改。但我同意很可能没有必要声明它
volatile,只要您至少使用__sync_*函数来访问它。
标签: c++ multithreading atomic