【发布时间】:2012-04-17 09:40:41
【问题描述】:
我有一个关于竞争条件和同时写入的问题。
我有一个从不同线程访问对象的类。我想仅按需计算一些值并缓存结果。出于性能原因,我宁愿不使用锁(在有人问之前 - 是的,这与我的情况有关)。
这构成了竞争条件。但是,对象是 const 并且不会更改。因此,如果不同的线程计算要缓存的值,它们在我的用例中保证是相同的。在不锁定的情况下写入这些值是否安全?或者,更广泛地说,从不同线程将相同内容写入内存而不加锁是否安全?
写入的值是 bool 和 double 类型,所讨论的架构可能是 x86 和 ARM。
编辑:感谢大家的意见。我终于决定找到一种不涉及缓存的方法。这种方法看起来确实很像“hack”,并且使用标志变量存在问题。
【问题讨论】:
-
我怀疑 C++ 能保证这一点,但至少对于现代硬件来说,很难想象会出现什么问题。
-
对原语的每个写入操作都是原子的,因此如果多个线程同时写入同一组字段,这应该不会有什么不同。
-
“所以如果不同的线程计算要缓存的值,它们在我的用例中保证是相同的”......这很奇怪。如果可以保证写入的值是相同的,为什么要同时写入呢?或者更好,为什么要多次编写它们?
-
@Paul Michalik:它们是经过计算的,因此是按需写入(存储)的。因为需求可能发生在不同的线程中,所以只写一次锁定是必需的。
-
我明白了。因此,然后使用一个条件变量来表示是否已经计算了一个数据。这可以使用互锁的“CompareExchange”在某种自旋锁内部进行原子操作,但是这是为您选择的平台实现的。我认为这是您可以获得的最小同步开销......
标签: c++ concurrency locking race-condition