我是在内存模型的意义上专门问的。http://en.cppreference.com/w/cpp/atomic/memory_order
我问是因为我想知道我是否可以std::memory_order_consume
在下面使用 a :
mLocalMemPtr1 和 2 以及 mAtomicMemPtr 是指向共享缓冲区的指针。
在生产者线程中,我正在做:
for (int x = 0; x < 10; ++x)
{
++mLocalMemPtr1
*mLocalMemPtr1 = x; // <========= A
mAtomicMemPtr.store(mLocalMemPtr1, std::memory_order_release);
}
在消费者中:
tempMemPtr = mAtomicMemPtr.load(std::memory_order_consume);
while (tempMemPtr != mLocalMemPtr2)
{
++mLocalMemPtr2;
int test = *mLocalMemPtr2; // <======== B
doSomeLongRunningThing(test);
tempMemPtr = mAtomicMemPtr.load(std::memory_order_consume);
}
那么依赖链是 tempMemPtr -> mLocalMemPtr2 -> test -> doSomeLongRunningThing 吗?
我特别担心B
之前可能会被执行A
。我知道我可以使用 a std::memory_order_acquire
,但如果条件语句导致内存顺序依赖,我可以使用 consume (更轻量级)。