зачем использовать std :: atomic, если для правильной работы все еще требуется мьютекс - PullRequest
0 голосов
/ 05 декабря 2018

Чтение текста для std::condition_variable Я сталкивался с этим предложением:

Даже если общая переменная является атомарной, ее необходимо изменить в мьютексе, чтобычтобы правильно опубликовать модификацию в ожидающем потоке.

Мой вопрос такой:

Какая польза от атомарного кода, если не для "кода без блокировки для работы с POD"?

ОБНОВЛЕНИЕ

Похоже, в моем вопросе есть некоторая путаница: (

«Общая переменная» в цитируемом тексте отличается от «переменная условия ". Смотрите эту цитату с той же страницы:

... до тех пор, пока другой поток не изменит общую переменную (условие) и не сообщит переменную condition_variable

Пожалуйста, не отвечайте «, почему нам нужно использовать мьютекс с условными переменными » или «, как работает условное ожидание », а скорее предоставьте информацию о том, как правильно использовать мьютекс »«модификация атома в вайтиng thread, т. е. нужно ли выполнять мьютекс для выражения вроде ++counter; (, а не , например, if(counter == 0))?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

зачем использовать std :: atomic, если [условная переменная] все еще требует, чтобы мьютекс работал правильно

Нет причин использовать атомную условную переменную.

Какая польза от атомик

Даже если атомики бесполезны для условных переменных, они все равно могут быть полезны для других случаев использования.Типичный вариант использования атомарного кода - реализация очереди без блокировки.

0 голосов
/ 05 декабря 2018

Семантика условного ожидания требует использования мьютекса.

Это связано с тем, что в потоке, который проверяет условие, существует потенциальное состояние гонки.Когда этот поток проверяет, стоит ли ждать, происходит следующее:

  1. получить эксклюзивную блокировку
  2. выполнить тест
  3. либо:

    a) снять блокировку и дождаться следующего сигнала

    b) сохранить блокировку и продолжить

Поскольку шаг 1 получает блокировку, все это атомарно, при условии, что все остальныепартии используют мьютекс правильно.

Но как быть, когда изменяемая переменная является атомарной?

Даже если общая переменная является атомарной, ее необходимо изменить в мьютексе, чтобычтобы правильно опубликовать модификацию в ожидающей ветке.

Ну, вот почему.Если поток B появляется и модифицирует атом за пределами мьютекса, то шаги 2 и 3 больше не являются атомарными.По сути, поток B может изменить значение сразу после выполнения шага 2.Тогда поток А потенциально примет неверное решение на шаге 3.

...