这个函数是否具有原子性和线程安全性?

6
我正在学习如何使用原子操作技术 :)
class foo {
  static std::atomic<uint32_t> count_;
  uint32 increase_and_get() {
    uint32 t = count_++;
    return t;
  }
}

increase_and_get()函数是线程安全的吗?


2
从实现的方式来看,我会称之为get_and_increase而不是increase_and_get - jogojapan
2个回答

12

是的,它是安全的:增量是原子性的,并且本地变量 t 不能被并发线程更改。您可以进一步简化代码,完全消除临时变量:

uint32 increase_and_get() {
    return count_++;
}

1
没有使用原子操作时,内存位置的递增不能保证是原子的。即使在x86上,两个处理器尝试同时递增也是可能的,如果没有使用原子操作,可能会导致两个不同调用的结果相同。(回复一条已删除评论!) - Mats Petersson
1
@MatsPetersson 这不就是 std::atomic 的全部意义所在吗? - mfontanini
1
我刚刚编辑了我的评论 - 请注意,这是作为对一个已被删除的评论的回复而发表的。 - Mats Petersson

5

是的,它将是线程安全的。当然,假设 std::atomic 实现没有任何 bug - 不过通常很容易正确实现。

std::atomic 正是为此而设计的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接