Re[18]: volatile у переменной класса
От: achp  
Дата: 18.01.05 19:50
Оценка: 29 (4) +1 :)
Здравствуйте, emusic, Вы писали:

A>>Хм... Если есть барьер, то зачем volatile?


E>Бааалин. Глухой телефон Кто обещал, что барьер можно специфицировать на конкретный объект? Если на каждый объект сделать функцию, которая обеспечивает сливание его в память на одном процессоре и всасывание в другом — разумеется, компилятор после выполнения этой функции перечитает любую часть объекта из памяти, ибо в функцию будет передаваться неконстантная ссылка


Причем здесь это? Прохождение барьера всегда связано с вызовом внешней функции. Объект, к которому возможно обращение из нескольких потоков — либо глобальный, либо к нему ранее были созданы пути доступа, которые компилятор отследить не в силах. Следовательно, компилятор обязан предполагать возможность изменения данных объектов.

Разумеется, это не касается случая, когда включена форсированная оптимизация. Ну, это уже ваш собственный выбор — у компилятора к услугам обманщиков вообще есть широчайший ассортимент способов устроить неопределенное поведение.

По мне так это несильно отличается от вот такого:

int f()
{
    char const* const p = "aaa";
    *const_cast<char*>(p) = 'b';
    const_cast<char const*&>(p) = p + 1;
}


Если же барьер не обеспечивает синхронизации памяти между процессорами, — ну тут уж извиняйте — никакое volatile вам не поможит.

E>А если барьер неспецифичный, вроде KeMemoryBarrier в виндовом ядре? Как объяснить компилятору, что после вызова некоторой функции без аргументов последнее известное значение объекта уже нельзя считать валидным? Разумеется, если не применять глубокой оптимизации — компилятор будет осторожничать и перечитывать после каждого вызова неизвестной ему функции. Указание volatile для разделяемых объектов позволит ему максимально оптимизировать остальные объекты. Если охота еще и оптимизации разделяемых объектов — значит, нужны специфичные барьерные примитивы на каждый разделяемый объект.


В Си/Си++ как языке просто нет легальных средств для такой тонкой оптимизации. То, о чём Вы пишете, относится к узкому случаю, связаннмоу с применением конкретного компилятора на конкретной платформе.

Разумеется, если ставить перед собой такие чисто практические задачи, то Вы совершенно правы.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.