Re[3]: volatile - нужен ли при pthread_mutex_lock() и в GTK?
От: ДимДимыч Украина http://klug.org.ua
Дата: 11.09.09 12:42
Оценка:
Здравствуйте, netch80, Вы писали:

N>Связаны. Volatile запрещает оптимизацию использования любой переменной в расчёте на участие в её судьбе постороннего агента. Кем этот агент является — сетевой картой, обработчиком прерывания или другой нитью — для компилятора уже неважно.


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

N>Цитирую стандарт:


N>

N>An object that has volatile-qualified type may be modified in ways unknown to the implementation or have unknown side effects.


Да, изменение переменной другой нитью можно назвать частным случаем 'modification in ways unknown to the implementation'.

N>Там дальше ссылка на abstract machine ("в строгом соответствии с ней"), не хочу это приводить, но смысл такой — вне выражения с переменной компилятор обязан потерять всё знание про неё.


Это следствие вышеприведенной цитаты.

Y>>>Где-то слышал, что компиляторы гарантируют, что после вызова функции в регистрах не окажется закэшированного значения переменной, но не уверен, так ли это.

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

N>Это верное утверждение, но для данного вопроса недостаточное.


Почему? Можно пример, когда pthread_mutex_lock()/pthread_mutex_unlock() без volatile недостаточно для обеспечения атомарности?
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.