Здравствуйте, 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 для разделяемых объектов позволит ему максимально оптимизировать остальные объекты. Если охота еще и оптимизации разделяемых объектов — значит, нужны специфичные барьерные примитивы на каждый разделяемый объект.
В Си/Си++ как языке просто нет
легальных средств для такой тонкой оптимизации. То, о чём Вы пишете, относится к узкому случаю, связаннмоу с применением конкретного компилятора на конкретной платформе.
Разумеется, если ставить перед собой такие чисто практические задачи, то Вы совершенно правы.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.