Sto chiedendo specificamente nel senso del modello di memoria. http://en.cppreference.com/w/cpp/atomic/memory_orderLe istruzioni condizionali C++ portano una dipendenza dall'espressione della condizione all'istruzione?
Mi sto chiedendo perché voglio sapere se posso usare un std::memory_order_consume
nel qui sotto:
mLocalMemPtr1 e 2 e mAtomicMemPtr sono puntatori in un buffer condiviso.
In un thread produttore che sto facendo:
for (int x = 0; x < 10; ++x)
{
++mLocalMemPtr1
*mLocalMemPtr1 = x; // <========= A
mAtomicMemPtr.store(mLocalMemPtr1, std::memory_order_release);
}
E nel consumatore:
tempMemPtr = mAtomicMemPtr.load(std::memory_order_consume);
while (tempMemPtr != mLocalMemPtr2)
{
++mLocalMemPtr2;
int test = *mLocalMemPtr2; // <======== B
doSomeLongRunningThing(test);
tempMemPtr = mAtomicMemPtr.load(std::memory_order_consume);
}
così fa la catena di dipendenza go tempMemPtr -> mLocalMemPtr2 -> prova -> doSomeLongRunningThing?
Sono particolarmente preoccupato che B
possa essere eseguito prima dello A
. So che posso usare un std::memory_order_acquire
, ma posso usare consumare (che è più leggero) se l'istruzione condizionale causa una dipendenza dell'ordine di memoria.