原子对象是否受到竞争条件的保护?

Are atomic objects protected against race conditions?

据我所知他们不是。

原子对象不存在数据竞争,但它们仍然会受到竞争条件的影响:两个线程可能以不可预测的顺序启动,从而使程序结果不确定。

共享数据将 "safe"(受原子保护),但顺序或时间仍然可能是错误的。

你能确认一下吗?

是的,你说得对,非原子操作可能仍然存在竞争条件。如果您有依赖于原子对象状态而不受其他线程干扰的非原子操作,则需要使用另一种同步技术来保持一致性。

原子对象上的原子操作将是一致的,但不是无竞争的。使用原子对象的非原子操作不是无竞争的。

不只是原子对象,任何原语可以与线程运行并发执行的操作一起使用:

  • 互斥体
  • 条件变量
  • 信号量
  • 障碍
  • 原子对象...

根据定义 只有在存在竞争 时才有用,这是访问模式的不可预测性。如果访问以可预测的方式有序排列,您将在编程语言中使用常规可变对象。

但即使顺序 先验 未知,最终结果也可以是确定的:考虑并发 运行 线程为静态 Web 服务器提供页面服务,其中页数和字节数是唯一可变的数据结构。统计信息可以保存在一个受互斥量保护的数据结构中(不需要互斥量,这只是一个简单的例子):互斥量锁定的顺序是不可预测的,但最终结果是该数据结构包含页的总和和字节服务;每个线程将计数添加到共享数据的顺序并不重要。