Здравствуйте, Шахтер, Вы писали:
E>>Из того, что я прочитал, я сделал вывод, что компилятор не будет оптимизировать доступ к общим данным, если рядом есть вызов синхронизирующего примитива (просто потому, что компилятор будет считать этот вызов вызовом с побочными эфектами).
Ш>Не обязательно. Компилятор может иметь список well-known функций, побочные эффекты от которых он знает. Например, фирме Майкрософт ничего не стоит научить VC++ оценивать побочные эффекты от вызова функций из API Win32. Технически, оптимизатор от VC++ содержит всё необходимое для этого.
Как раз таки тогда VC++ прекрасно поймет, что после вызова функций типа WaitFor*Object нужно осуществлять перечитывание значений переменных, т.к. эти функции явно могут приводить к возникновению побочных эффектов.
E>>И я сомневаюсь, что они будут делать ее в будущем.
Ш>Стандарт это не запрещает. Единственный 100% легальный метод гарантировать это на сегодня -- использовать volatile. Так что всё остальное -- на твой страх и риск.
Вот здесь:
Double-Checked Locking, Threads, Compiler Optimizations, and More Скот Мейерс показывает, что даже использование volatile не гарантирует ожидаемого эффекта в многопоточном приложении (даже при использовании примитивов синхронизации). И делает замечательный вывод:
Bottom line: the road to thread-safe code isn't paved with volatile
Ничего личного, Шахтер, но я более склонен согласиться с Мейерсом, чем с вами
Ш>Нет никаких сображений совместимости с нелегальным кодом. Полно примеров, когда новые компиляторы отказываются компилировать код, который компилировался старыми компиляторами, но не удовлетворял стандарту.
Думаю, что здесь не все так однозначно. Нынешний стандарт никак не определял особенностей и привязки к многопоточности. Что оставляло большое поле для реализации различных решений при создании многопоточных приложений. И отмахнуться от того, что 20% (цифра с потолка) написанных на C++ многопоточных приложений окажутся не совместимыми со следующим стандартом сейчас уже никто не сможет. А я подозреваю, что таких приложений гораздо больше.
Поэтому я надеюсь, может быть, напрасно, что добавление в C++ стандарт поддержки многопоточности произойдет без необходимости использования модификатора volatile для всех разделяемых между потоками данных.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>