2013-05-21 3 views
2

Я смотрел пример 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]; 

Boost Example

Здесь это то, что я понял (поправьте меня, если я ошибаюсь):

  1. Если load операция thread2 предшествует store операции по thread1, то tmp будет data[0].
  2. Если операция store операции thread1 предшествует load операций по thread2, то tmp будет data[ 1 ] потому store(1,memory_order_release) по thread1 будут гарантировать, что все предыдущие записи в другие ячейки памяти могут видеть thread2 даже хотя data[] не зависит от индекса по индексу.

Может кто-нибудь прояснить ошибку, о которой они говорят?

ответ

1

С release/consume, пишет переменные до store(release) только гарантированно видны совпадающим load(consume), если, и только если, переменные зависят от переменной, используемой в store(release) - пара load(consume).

С помощью int литералов индексировать data[] эта зависимость была нарушена, таким образом, пишет data[] не гарантированно видны после a.load(consume).

+0

Aha! Хорошо. Я понял. Большое спасибо – user2404835

+0

@ user2404835, без проблем. Я бы рекомендовал не принимать этот ответ на некоторое время и посмотреть, приходят ли другие более информативные ответы. Если нет, тогда не стесняйтесь принять его тогда. – hmjd

+0

Хорошо. В очередной раз благодарим за помощь! – user2404835

Смежные вопросы