Multithreading 原子对象是否受到保护,不受竞争条件的影响?

Multithreading 原子对象是否受到保护,不受竞争条件的影响?,multithreading,atomic,race-condition,data-race,Multithreading,Atomic,Race Condition,Data Race,据我所知,他们不是 原子对象没有数据争用,但它们仍然会受到争用条件的影响:两个线程可能以不可预测的顺序启动,从而使程序结果不确定 共享数据将是“安全的”(受原子保护),但顺序或时间可能仍然是错误的 您能确认这一点吗?是的,您是正确的,非原子操作可能仍然存在争用条件。如果您的非原子操作依赖于原子对象的状态,而不受其他线程的干扰,则需要使用另一种同步技术来保持一致性 原子对象上的原子操作将是一致的,但不是无竞争的。使用原子对象的非原子操作不是无竞争的 不仅仅是原子对象,可以与并发运行的线程执行的操作

据我所知,他们不是

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

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


您能确认这一点吗?

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


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

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

  • 互斥
  • 条件变量
  • 信号量
  • 屏障
  • 原子对象
根据定义,只有在存在种族时才有用,这是访问模式中的不可预测性。如果访问以可预测的方式有序进行,那么您应该在编程语言中使用常规的可变对象


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

当然。您还需要知道信号量、互斥、监视器、读写器锁、条件变量、临界区、自旋锁等术语的含义以及使用它们的时间。原子操作不会自动无竞争。线程A和B都在原子计数器上执行原子get和增量。哪一个的数字较低?