3

据我所知,他们不是。

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

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

你能证实这一点吗?

4

2 回答 2

1

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

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

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

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

于 2019-03-02T18:01:52.777 回答
1

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

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

于 2019-03-02T14:39:03.987 回答