С большим интересом прочитал развернувшуюся здесь дискуссию. Эта тема меня очень заинтересовала. Дело в том, что я использую многопоточность давно, еще года с 1996, под разными ОС (Win32, OS/2, Linux, FreeBSD, HP NonStop). Но про взаимосвязь между volatile и многопоточностью узнал впервые в этой ветке. Действительно, меньше знаешь -- крепче спишь.
До сих пор программировал без volatile. В основном из-за того, что в далеких 90-х еще не все компиляторы поддерживали такие ключевые слова, как volatile, вот и привык его не использовать (т.к. драйверов на C++ на писал). Написанный мной код, к счастью, работал. Но, по стечению обстоятельств, только на однопроцессорных машинах. Был только один случай, когда одна из систем была установлена на двухпроцессорной машине под Win2K. И как раз там наблюдались странные сбои, которые прекращались после перекомпиляции проекта любым компилятором, отличным от VC6.0sp5 (Borland C++, MinGW, VC7.0). Тогда причину сбоев установить не удалось, т.к. после перехода на VC7.0, а затем VC7.1, сбоев не было.
В связи с этим у меня вопрос: можно ли услышать/увидеть реальные примеры того, как в многопоточных приложениях обнаруживались проблемы из-за того, что не использовалось volatile? Именно реальные, хорошо бы с примерами, хотя бы псевдокода. И не драйверов или софта для работы с железом, а "прикладного" кода.
Просто у меня сложилось такое мнение, что сейчас что с volatile, что без, если используешь штатные средства синхронизации (будь то WinAPI или POSIX), то можно быть спокойным. Более того, разработчики компиляторов не могут не учитывать того факта, что в мире немало программистов (я из их числа), которые не озаботились применением volatile в многопоточном приложении. И если выйдет новая версия компилятора, для которого применение volatile критически важно, то все эти программисты столкнутся с огромным объемом неработоспособного кода. Поэтому можно ожидать, что и в новых компиляторах многопоточные приложения без volatile останутся работоспособными. Но это мое впечатление.
Заранее спасибо.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.