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

ДД>Здравствуйте, riYu, Вы писали:


Y>>Если при доступе к переменной я окружаю код вызовами pthread_mutex_lock()/pthread_mutex_unlock(), то нужно ли при ее объявлении использовать квалификатор volatile?


ДД>Эти средства относятся к разным областям и никак не связаны.


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

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


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

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

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

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

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


А это не метод синхронизации, это обеспечение её корректности.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.