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

Posted

技术标签:

【中文标题】原子对象是不是受到保护免受竞争条件的影响?【英文标题】:Are atomic objects protected against race conditions?原子对象是否受到保护免受竞争条件的影响? 【发布时间】:2019-03-02 13:03:41 【问题描述】:

据我所知,他们不是。

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

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

你能确认一下吗?

【问题讨论】:

当然。您还需要了解信号量、互斥量、监视器、读取器/写入器锁、条件变量、临界区、自旋锁等术语的含义以及何时使用它们。 【参考方案1】:

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

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

【讨论】:

原子操作不是自动无竞争的。线程 A 和 B 都在原子计数器上执行原子 get-and-increment。哪一个得到较小的数字?【参考方案2】:

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

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

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

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

【讨论】:

以上是关于原子对象是不是受到保护免受竞争条件的影响?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005:“保护”存储过程免受 MS Access 使用的 FMTONLY 模式的影响

sql参数保护你免受啥影响?

需要对条件变量寻求的互斥保护(原子)赋值吗?

Vue.js:如何保护登录组件免受经过身份验证的用户的影响

签名以保护 JAR 免受逆向工程

保护企业业务免受网络故障影响的三个关键步骤