Код: Выделить всё
using namespace std::experimental::parallel;
std::atomic x = 0;
int a[] = {1,2};
for_each(par, std::begin(a), std::end(a), [&](int n) {
x.fetch_add(1, std::memory_order_relaxed);
// spin wait for another iteration to change the value of x
while (x.load(std::memory_order_relaxed) == 1) { }
});
Приведенный выше пример зависит от порядка выполнения итераций,
и поэтому не определен (возможна тупиковая ситуация).
Но я не могу посмотреть, почему это может привести к тупику. Насколько я понял, хотя порядок памяти указан как std::memory_order_relaxed, речь идет только о времени, когда поток увидит некоторые изменения, сделанные другим потоком, поэтому в конечном итоге (возможно, через неограниченное количество времени) эти изменения должны в любом случае это будет замечено читателями.
Может кто-нибудь объяснить? Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/427 ... with-a-spi
Мобильная версия