【发布时间】:2011-12-15 23:36:39
【问题描述】:
关于以下代码:
std::atomic<int> myint; //Shared variable
//(...)
if( --myint == 0) {
//Code block B
}
是否可能有多个线程访问我命名为“代码块 B”的块?
请考虑不会发生溢出,'if' 被多个线程同时执行,整个程序中对 myint 的唯一修改是 -- myint 在 if 和那个 myint 被初始化为一个正值。
【问题讨论】:
-
@Patrick 那将是未定义的行为。
-
真正的问题是 std::atomic
::operator-- 是否以原子方式返回旧值。 -
@cdleonard - 递减是原子的并返回结果。但是,当您将结果与零进行比较时,没有什么可以阻止另一个线程立即增加或减少值。
-
@BoPersson 但是返回的值不会被任何后续对 myint 的修改所修改。所以,理论上,如果 myint 的值单调递减(折扣溢出),那么只有单个线程可以进入块。
-
@curiousguy 我不知道你在说什么,我从来没有在我的问题上说“下溢”... =)
标签: c++ multithreading concurrency c++11 atomic