Почему этот параллельный for_each, упомянутый в n4507, может привести к взаимоблокировке с ожиданием вращения в теле цикC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему этот параллельный for_each, упомянутый в n4507, может привести к взаимоблокировке с ожиданием вращения в теле цик

Сообщение Anonymous »

Смотрите следующий код, взятый с http://www.open-std.org/jtc1/sc22/wg21/ ... /n4507.pdf, страница 12:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»