原子对象是否受到竞争条件的保护?
Are atomic objects protected against race conditions?
据我所知他们不是。
原子对象不存在数据竞争,但它们仍然会受到竞争条件的影响:两个线程可能以不可预测的顺序启动,从而使程序结果不确定。
共享数据将 "safe"(受原子保护),但顺序或时间仍然可能是错误的。
你能确认一下吗?
是的,你说得对,非原子操作可能仍然存在竞争条件。如果您有依赖于原子对象状态而不受其他线程干扰的非原子操作,则需要使用另一种同步技术来保持一致性。
原子对象上的原子操作将是一致的,但不是无竞争的。使用原子对象的非原子操作不是无竞争的。
不只是原子对象,任何原语可以与线程运行并发执行的操作一起使用:
- 互斥体
- 条件变量
- 信号量
- 障碍
- 原子对象...
根据定义 只有在存在竞争 时才有用,这是访问模式的不可预测性。如果访问以可预测的方式有序排列,您将在编程语言中使用常规可变对象。
但即使顺序 先验 未知,最终结果也可以是确定的:考虑并发 运行 线程为静态 Web 服务器提供页面服务,其中页数和字节数是唯一可变的数据结构。统计信息可以保存在一个受互斥量保护的数据结构中(不需要互斥量,这只是一个简单的例子):互斥量锁定的顺序是不可预测的,但最终结果是该数据结构包含页的总和和字节服务;每个线程将计数添加到共享数据的顺序并不重要。
据我所知他们不是。
原子对象不存在数据竞争,但它们仍然会受到竞争条件的影响:两个线程可能以不可预测的顺序启动,从而使程序结果不确定。
共享数据将 "safe"(受原子保护),但顺序或时间仍然可能是错误的。
你能确认一下吗?
是的,你说得对,非原子操作可能仍然存在竞争条件。如果您有依赖于原子对象状态而不受其他线程干扰的非原子操作,则需要使用另一种同步技术来保持一致性。
原子对象上的原子操作将是一致的,但不是无竞争的。使用原子对象的非原子操作不是无竞争的。
不只是原子对象,任何原语可以与线程运行并发执行的操作一起使用:
- 互斥体
- 条件变量
- 信号量
- 障碍
- 原子对象...
根据定义 只有在存在竞争 时才有用,这是访问模式的不可预测性。如果访问以可预测的方式有序排列,您将在编程语言中使用常规可变对象。
但即使顺序 先验 未知,最终结果也可以是确定的:考虑并发 运行 线程为静态 Web 服务器提供页面服务,其中页数和字节数是唯一可变的数据结构。统计信息可以保存在一个受互斥量保护的数据结构中(不需要互斥量,这只是一个简单的例子):互斥量锁定的顺序是不可预测的,但最终结果是该数据结构包含页的总和和字节服务;每个线程将计数添加到共享数据的顺序并不重要。