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

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

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

У меня вопрос такой:

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

ОБНОВИТЬ

Похоже, что мой вопрос не совсем понятен 🙁

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

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

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

-3

Решение

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

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

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

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

    б) сохранить замок и продолжить

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

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

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

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

4

Другие решения

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

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

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

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

1

По вопросам рекламы [email protected]