C++条件语句是否带有从条件表达式到语句的依赖?

Twi*_*cle 6 c++ memory-model c++11

我在内存模型意义上具体要求.http://en.cppreference.com/w/cpp/atomic/memory_order

我问,因为我想知道我是否可以使用std::memory_order_consume以下内容:

mLocalMemPtr1和2以及mAtomicMemPtr是指向共享缓冲区的指针.

在我正在做的生产者线程中:

for (int x = 0; x < 10; ++x)
{
    ++mLocalMemPtr1
    *mLocalMemPtr1 = x;       // <========= A
    mAtomicMemPtr.store(mLocalMemPtr1, std::memory_order_release);
}
Run Code Online (Sandbox Code Playgroud)

在消费者中:

tempMemPtr = mAtomicMemPtr.load(std::memory_order_consume);
while (tempMemPtr != mLocalMemPtr2)
{
    ++mLocalMemPtr2;
    int test = *mLocalMemPtr2;   // <======== B
    doSomeLongRunningThing(test);
    tempMemPtr = mAtomicMemPtr.load(std::memory_order_consume);
}
Run Code Online (Sandbox Code Playgroud)

那么依赖链是tempMemPtr - > mLocalMemPtr2 - > test - > doSomeLongRunningThing吗?

我特别担心B以前可能会被执行A.我知道我可以使用a std::memory_order_acquire,但如果条件语句导致内存顺序依赖,我可以使用consume(更轻量级).

Ben*_*igt 0

我相信通过排序,编译器实际上可以提前consume复制整个内容。mSharedBuffer您需要acquire语义来使先前缓存的变量副本(除 之外)无效mAtomicMemLocPtr