Здравствуйте, MaximE, Вы писали:
ME>c-smile wrote:
>> The volatile keyword is a type qualifier used to declare that an object can be modified in the program by something other than statements, such as the operating system, the hardware, or a concurrently executing thread.
>> [/q]
ME>Это не так. Кусок не из стандарта, а наверное, из MSDN. Почитайте про sequence points.
Sequence points — это вообще из другой оперы. Sequence point — место, где заканчиваются
побочные эффекты, и не более того. Причем относится это исключительно к имеющему место "потоку выполнения", и к параллельным потокам отношения не имеет. А вот при наличии volatile при каждом обращении к такому объекту формируется sequence point. Прохождение sequence point отнюдь не гарантирует, что состояния всех объектов в этой точке будут непременно отражены в памяти — это гарантируется только для volatile-объектов.
ME>Вообще, квалификатор volatile у всех Interlocked* функций абсолютно бесполезен, и даже вреден, так как сбивает людей с толку. Так как это ф-ции, то они представляют для компилятора sequence points.
Функции используются только для изменения volatile-переменных. Чтение их значений может происходить в параллельных потоках без каких-либо функций.
ME> После sequence points, компилятор обязан перечитывать значения переменных из памяти, неважно, volatile ли, const ли, или это переменная без cv-квалификатора
С чего бы он вдруг стал обязан? Компилятор обязан лишь обеспечить последовательное выполнение заданных действий в рамках одного потока исполнения. Для взаимодействия с "внешними" процессами и существует volatile.
Простейший пример:
void f (int &a, int &b) {
if (!a) {
b = a;
}
}
При включенной оптимизации многие компиляторы (например, VC++ 6.0) сгенерируют только один опрос переменной
a — в проверке условия. Для присваивания будет сгенерирован явный нуль. Если к
a добавить volatile — будет сгенерировано повторное чтение из памяти. И совершенно правильно.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>