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(更轻量级).
我相信通过排序,编译器实际上可以提前consume
复制整个内容。mSharedBuffer
您需要acquire
语义来使先前缓存的变量副本(除 之外)无效mAtomicMemLocPtr
。
归档时间: |
|
查看次数: |
546 次 |
最近记录: |