Re[3]: volatile у переменной класса
От: Alex Alexandrov США  
Дата: 21.06.05 20:06
Оценка: 48 (3) +2
Здравствуйте, <Аноним>, Вы писали:

А>Если переменная не объявлена как volatile то цикл

А>while(!m_bDone); будет всю жизнь крутиться. Так как компилятор не дурак. Он один раз прочтет m_bDone в регистр (кэш процессора) и потом каждый раз будет его проверять. И то что m_bDone уже давно была установлена другим потоком никогда не узнает.

А>Если переменая объявлена как volatile то компилятору это команда что каждый раз перед обращением к этой переменной её нужно считать из памяти.


А>======================================================

А>И мютексы не нужны, и volatile нужны.

Ох, зря эту ветку подняли... Рекомендую прочитать все перед высказыванием мыслей.

Вкратце:

1. Синхронизация через глобальную переменную без использования примитивов синхронизации или атомарных операций в общем случае некорректна. Казалось бы, какие проблемы могут быть в случае простого применения булевой переменной volatile? Ведь она либо есть, либо ее нет! Могут. Если потоки будут исполняться на разных процессорах одновременно, и процессор обладает способностью и желанием переупорядочивать операции чтения-записи в память, то второй процессор может увидеть изменения не в том порядке, в котором он ожидает. В частности, флажок может быть увиден установленным перед тем, как изменятся синхронизируемые таким способом данные (ой-ой-ой...). Так что volatile недостаточен.

2. Как только вы вставляете в свой многопоточный код вызовы функций синхронизации WaitFor... или Interlocked... они начинают служить барьером времени компиляции для компилятора, форсируя его перезагружать глобальные переменные в регистры процессора, поскольку вызовы этих функций для компилятора — черный ящик и он не может делать предположений о том, меняют они содержимое регистров или нет. Соответственно, WaitFor.../Interlocked... служит заодно двусторонним барьером памяти для процессора.

3. Таким образом, при использовании функций синхронизации, что highly appreciated, можно обойтись без volatile. Главным аргументом сторонников volatile в ветке было возможное "поумнение" компилятора, при котором он вдруг сможет понять, что регистры на самом деле функциями синхронизации не затрагивались и, значит, регистры перезагружать нельзя. Честно говоря, не уверен, что это произойдет когда-нибудь.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.