Безопасно ли читать целочисленную переменную, которая одновременно изменяется без блокировки? - PullRequest
46 голосов
/ 29 августа 2009

Предположим, у меня есть целочисленная переменная в классе, и эта переменная может быть одновременно изменена другими потоками. Пишет защищены мьютексом. Нужно ли защищать чтение тоже? Я слышал, что есть некоторые аппаратные архитектуры, на которых, если один поток изменяет переменную, а другой поток читает ее, тогда результат чтения будет мусором; в этом случае мне нужно защитить чтения. Я никогда не видел таких архитектур.

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

Ответы [ 12 ]

0 голосов
/ 29 августа 2009

И чтение / запись в переменные с параллелизмом должны быть защищены критическим разделом (не мьютексом). Если вы не хотите тратить весь день на отладку.

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

0 голосов
/ 29 августа 2009

Если переменная помечена ключевым словом volatile, тогда чтение / запись становится атомарным, но это имеет много-много других последствий с точки зрения того, что делает компилятор и как он ведет себя, и его не следует просто использовать для этой цели.

Узнайте, что именно делает volatile, прежде чем вслепую начать его использовать: http://msdn.microsoft.com/en-us/library/12a04hfd(VS.80).aspx

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