C ++并发:条件原子操作?

时间:2016-10-07 04:58:19

标签: c++ multithreading

这个问题与这个问题有关,但我决定简化这个问题,以便更容易回答。 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 ++标准的理解,原子序的这种排序确保了读者必须看到加载器的所有效果。我是对的吗?

0 个答案:

没有答案