是否保护了原子物体免受竞争条件影响?

时间:2019-03-02 13:03:42

标签: multithreading atomic race-condition data-race

据我所知不是。

原子对象没有数据争用,但是它们仍然会遭受争用条件的影响:两个线程可能以不可预测的顺序启动,从而导致程序结果不确定。

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

您可以确认吗?

2 个答案:

答案 0 :(得分:1)

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

对原子对象的原子操作将是一致的,但并非无竞争。使用原子对象的非原子操作并非无种族限制。

答案 1 :(得分:1)

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

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

根据定义 仅在出现种族时才有用,这是访问模式的不可预测性。如果访问以一种可预测的方式井井有条,那么您应该使用编程语言中的常规可变对象。

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