Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, 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 для переменной — это, грубо говоря, прибивание операций с переменной гвоздями. Будет имееть определенный эффект при синхронизации, но все же синхронизацию принято осуществлять другими методами.
А это не метод синхронизации, это обеспечение её корректности.