You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::atomic单语句内两个序列点是否具备线程安全性?

代码线程安全性分析
std::atomic<int> atomic_number = 0;
std::thread t;

while (1) {
    t = std::thread(f);
    t.detach();
}
void f() {
    if ((++atomic_number) < 5) { // the total operation line
    }
}

提问:在上述代码中,++atomic_number操作与atomic_number < 5操作属于同一语句内的两个序列点,请问该整行操作是否线程安全?其他线程对atomic_number的操作是否可能插入到这两个操作之间?

  • 这整行操作不是线程安全的。
  • 其他线程对atomic_number的操作完全可能插入到这两个操作之间。

具体解释:
++atomic_number和atomic_number < 5各自是原子操作,但二者的组合没有原子性保障。也就是说,当一个线程完成++atomic_number的递增后,还没执行<5的判断时,其他线程可以毫无阻碍地修改atomic_number的值。

举个典型场景:假设当前atomic_number的值为3,线程A执行++atomic_number将其变为4,此时线程A尚未执行<5的判断;此时线程B介入,执行++atomic_number把值改成5;之后线程A才进行判断,此时判断的是5<5,结果为false,但如果没有线程B的插入,线程A原本应该判断4<5,结果为true——这就出现了逻辑上的错误,证明这段代码的整行操作不具备线程安全性。

内容的提问来源于stack exchange,提问作者3088 K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:01:51