原子对象是不是受到保护免受竞争条件的影响?
Posted
技术标签:
【中文标题】原子对象是不是受到保护免受竞争条件的影响?【英文标题】:Are atomic objects protected against race conditions?原子对象是否受到保护免受竞争条件的影响? 【发布时间】:2019-03-02 13:03:41 【问题描述】:据我所知,他们不是。
原子对象没有数据竞争,但它们仍然会受到竞争条件的影响:两个线程可能以不可预测的顺序启动,从而导致程序结果不确定。
共享数据将是“安全的”(受原子保护),但顺序或时间仍然可能是错误的。
你能确认一下吗?
【问题讨论】:
当然。您还需要了解信号量、互斥量、监视器、读取器/写入器锁、条件变量、临界区、自旋锁等术语的含义以及何时使用它们。 【参考方案1】:是的,你说得对,非原子操作可能仍然存在竞争条件。如果有非原子操作依赖于原子对象的状态而不受其他线程的干扰,则需要使用另一种同步技术来保持一致性。
对原子对象的原子操作将是一致的,但不是无竞争的。使用原子对象的非原子操作不是无竞争的。
【讨论】:
原子操作不是自动无竞争的。线程 A 和 B 都在原子计数器上执行原子 get-and-increment。哪一个得到较小的数字?【参考方案2】:不仅仅是原子对象,任何原语都可以与并发运行的线程执行的操作一起使用:
互斥体 条件变量 信号量 屏障 原子对象...根据定义只有在存在竞争时才有用,这是访问模式的不可预测性。如果访问以可预测的方式有序排列,那么您将在编程语言中使用常规的可变对象。
但即使顺序是先验未知的,最终结果也可能是确定性的:考虑为静态 Web 服务器提供页面的并发运行线程,页面和字节数作为只有可变的数据结构。统计信息可以保存在受互斥体保护的数据结构中(不需要互斥体,这只是一个简单的例子):互斥体锁定的顺序是不可预测的,但最终结果是数据结构包含页面总和和提供的字节数;每个线程将计数添加到共享数据中的顺序并不重要。
【讨论】:
以上是关于原子对象是不是受到保护免受竞争条件的影响?的主要内容,如果未能解决你的问题,请参考以下文章