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
相关产品推荐
相关产品推荐

