c-smile wrote:
> Здравствуйте, Vet, Вы писали:
>
> Vet>В объекте класса есть переменная, которая используется двумя потоками.
> Vet>Один из потоков иногда меняет ее значение.
> Vet>Есть ли необходимость в этом случае делать переменную как volatile.
> Vet>И зависит ли ответ от того, сздан ли объект класса на стеке или в динамической памяти.
>
> Vet>Вопрос вызван тем, что у Рихтера прочитал, что если глобальная переменная используется
> Vet>разными потоками, то она обязана быть volatile. Вот меня и рабирают сомнения нужно ли
> Vet>тоже самое делать для переменных(членов) класса.
>
> Да, обязательно, иначе оптимизатор тебе такого наворотит — не обрадуешься.
> > 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.
Это не так. Кусок не из стандарта, а наверное, из MSDN. Почитайте про sequence points.
> Желательно еще установку этой переменной выполнять с помощью InterlockedExchange.
> Собственно так как эта функция объявлена как
>
> > LONG InterlockedExchange(
> LPLONG volatile Target, // value to exchange
> LONG Value // new value
> );
>
>
> без объявления volatile у тебя ничего и не получится.
Наверное, LPLONG volatile
* (star) Target? Почему же без volatile не получиться? Как и в функцию, которая принимает указатель на константный объект мы можем передать указатель на неконстнантный объект, но но не наооборот, так и в функциию принимающую указатель на волатильный, мы можем передать указатель на неволатильный объект.
Вообще, квалификатор volatile у всех Interlocked* функций абсолютно бесполезен, и даже вреден, так как сбивает людей с толку. Так как это ф-ции, то они представляют для компилятора sequence points. После sequence points, компилятор обязан перечитывать значения переменных из памяти, неважно, volatile ли, const ли, или это переменная без cv-квалификатора, и оптимизатор здесь не может ничего сделать.
--
Maxim YegorushkinPosted via RSDN NNTP Server 1.9