Каково влияние аргумента InterlockedIncrement, объявленного как volatile - PullRequest
3 голосов
/ 14 сентября 2010

InterlockedIncrement и другие операции Interlocked объявляют свои аргументы как volatile.Зачем?Каково намерение и следствие этого?

Ответы [ 4 ]

9 голосов
/ 14 сентября 2010

Вероятный эффект очень минимален. Наиболее вероятное намерение состоит в том, чтобы позволить пользователям передавать volatile -качественные переменные в эти функции без необходимости приведения типа.

4 голосов
/ 14 сентября 2010

Это сделано для того, чтобы функцию можно было вызывать как для обычных переменных, так и для переменных. Нельзя передать переменную volatile в функцию, которая не ожидает аргумента volatile. Следующий код не компилируется (протестировано с компилятором Visual Studio 2005 C ++):

void TestV(int *a)
{
  *a = 1;
}

void Test()
{
  volatile int a = 0;
  TestV(&a);
}

С декларацией можно сделать следующее:

volatile LONG a = 0;

InterlockedIncrement(&a);

Поскольку наиболее вероятно, что имеет смысл вызывать InterlockedIncrement для изменчивых переменных, представляется разумным объявить его таким.

0 голосов
/ 14 сентября 2010

Короче говоря, volatile означает «эта переменная может быть изменена вне этой программы».

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

0 голосов
/ 14 сентября 2010

Аргумент volatile запрещает компилятору выполнять оптимизации, препятствующие чтению в память.Компилятор может выполнять любые оптимизации, которые ему нравятся, при условии, что видимые эффекты кода одинаковы, но эти эффекты не учитываются в многопоточных сценариях, только из одного потока.Ключевое слово volatile сообщает компилятору, что эта переменная может быть изменена или прочитана из внешних неизвестных источников, и компилятор не может от нее избавиться или получить доступ к памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...