这个问题与这个问题有关,但我决定简化这个问题,以便更容易回答。 C++ concurrency: Variable visibility outside of mutexes
假设我有以下设置。有reader
个任意数,只有1个loader
。您可以对此代码采取以下措施:
(*)
和(**)
是RW无竞赛(但不一定是通过常见的互斥锁)。换句话说,我通过下面未显示的同步代码保证,如果(**)
写入,那么所有读者都可以保证在同步循环中旋转#34;。但请注意,多个读者可以一次阅读。(1)
到(5)
可以是任何内容 - 与其他对象,条件,等待,阅读mAtomic
等同步,除了代码可能导致{{1使用loader
对其写入进行竞争。 ...
reader
我现在的问题很简单。无论行atomic_int32_t mAtomic = 1;
BigObject mShared;
void reader() {
for (;;) { // thread loop
for (;;) { // synchro loop
// (1)
if (mAtomic.compare_exchange_weak(expect, desired)) // seq-con
break;
// (2)
}
mShared.readOnlyHeavyComputations(); // (*)
}
}
void loader() {
for (;;) { // thread loop
while (planetsAreAligned()); // spin until whenever
// (3)
int32_t old = mAtomic.exchange(valReaderWontExpect); // seq-con
// (4)
mShared.loadFromFile("example.foo"); // (**)
mAtomic.store(old); // seq-con
// (5)
}
}
,(1)
,(2)
,(3)
和(4)
发生了什么(但如上所述),请写{{1在(5)
根据我对顺序一致原子的理解,答案是肯定的 - 因为直接在(**)
之后,(*)
被存储到 - (**)
被mAtomic
观察到在退出同步循环之前。根据我对C ++标准的理解,原子序的这种排序确保了读者必须看到加载器的所有效果。我是对的吗?