Я смотрел пример Boost относительно атомных операций и отношений между событиями и раньше, и я немного смущен. В «происходит, прежде, чем через выпуск и потребление» раздел, есть следующий пример, что они говорят, что это ошибочно, но я не могу видеть его:Boost memory_order_consume Пример
atomic<int> a(0);
complex_data_structure data[2];
thread1:
data[1] = ...; /* A */
a.store(1, memory_order_release);
thread2:
int index = a.load(memory_order_consume);
complex_data_structure tmp;
if (index == 0)
tmp = data[0];
else
tmp = data[1];
Здесь это то, что я понял (поправьте меня, если я ошибаюсь):
- Если
load
операция thread2 предшествуетstore
операции по thread1, тоtmp
будетdata[0]
. - Если операция
store
операции thread1 предшествуетload
операций по thread2, тоtmp
будетdata[ 1 ]
потомуstore(1,memory_order_release)
по thread1 будут гарантировать, что все предыдущие записи в другие ячейки памяти могут видеть thread2 даже хотяdata[]
не зависит от индекса по индексу.
Может кто-нибудь прояснить ошибку, о которой они говорят?
Aha! Хорошо. Я понял. Большое спасибо – user2404835
@ user2404835, без проблем. Я бы рекомендовал не принимать этот ответ на некоторое время и посмотреть, приходят ли другие более информативные ответы. Если нет, тогда не стесняйтесь принять его тогда. – hmjd
Хорошо. В очередной раз благодарим за помощь! – user2404835