Tôi hỏi cụ thể về ý nghĩa của mô hình bộ nhớ. http://en.cppreference.com/w/cpp/atomic/memory_orderCác câu lệnh điều kiện C++ có mang phụ thuộc từ biểu thức điều kiện đến câu lệnh không?
Tôi hỏi vì tôi muốn biết nếu tôi có thể sử dụng một std::memory_order_consume
ở dưới đây:
mLocalMemPtr1 và 2 và mAtomicMemPtr là con trỏ vào một bộ đệm chia sẻ.
Trong một sợi sản xuất tôi đang làm:
for (int x = 0; x < 10; ++x)
{
++mLocalMemPtr1
*mLocalMemPtr1 = x; // <========= A
mAtomicMemPtr.store(mLocalMemPtr1, std::memory_order_release);
}
Và trong người tiêu dùng:
tempMemPtr = mAtomicMemPtr.load(std::memory_order_consume);
while (tempMemPtr != mLocalMemPtr2)
{
++mLocalMemPtr2;
int test = *mLocalMemPtr2; // <======== B
doSomeLongRunningThing(test);
tempMemPtr = mAtomicMemPtr.load(std::memory_order_consume);
}
Vì vậy, hiện chuỗi phụ thuộc đi tempMemPtr -> mLocalMemPtr2 -> test -> doSomeLongRunningThing?
Tôi đặc biệt lo lắng rằng B
có thể được thực thi trước A
. Tôi biết tôi có thể sử dụng một std::memory_order_acquire
, nhưng tôi có thể sử dụng tiêu thụ (đó là nhẹ hơn) nếu tuyên bố điều kiện gây ra một sự phụ thuộc thứ tự bộ nhớ.