Здравствуйте, ДимДимыч, Вы писали:
N>>Связаны. Volatile запрещает оптимизацию использования любой переменной в расчёте на участие в её судьбе постороннего агента. Кем этот агент является — сетевой картой, обработчиком прерывания или другой нитью — для компилятора уже неважно. ДД>Нам ведь нужно целостность переменной обеспечить, а не запретить оптимизацию. Volatile скажет о том, что при каждой записи в переменную произойдет физическая запись по адресу, где эта переменная находится, а при каждом чтении — физическое чтение по этому адресу. Для обеспечения целостности переменной это не является ни необходимым, ни достаточным условием.
Но если вместе с этим обеспечен запрет от чужого доступа средствами синхронизации, такими, как мьютексы — полученный комплекс средств достаточен. Необходим ли — это более абстрактно-философский вопрос, обсуждать который я не хочу.
ДД>Да, изменение переменной другой нитью можно назвать частным случаем 'modification in ways unknown to the implementation'.
Ну дык ёлы-палы.;)
Y>>>>Где-то слышал, что компиляторы гарантируют, что после вызова функции в регистрах не окажется закэшированного значения переменной, но не уверен, так ли это. ДД>>>Компиляторы гарантируют, что последствия операций будут такими же, как если бы операции выполнились в том порядке, в каком они присутствуют в коде. Если это не так — значит, баг в компиляторе. N>>Это верное утверждение, но для данного вопроса недостаточное. ДД>Почему? Можно пример, когда pthread_mutex_lock()/pthread_mutex_unlock() без volatile недостаточно для обеспечения атомарности?
А при чём тут атомарность? Атомарность-то они обеспечат. А вот отсутствие кэширования — нет.