Летучие ли хорошо с этим видом использования? - PullRequest
0 голосов
/ 21 марта 2012

Скажем, я проверяю переменную в цикле следующим образом.

while( var )
  ;

Здесь var должно быть объявлено volatile, если программа многопоточная и var *Доступ к 1008 * осуществляется несколькими потоками.Это известный факт.Но, допустим, у нас есть что-то вроде этого.

while( var + 1 )
  ;

Будет ли это работать с volatile?Я имею в виду, возможно ли, чтобы компилятор кэшировал значение (var + 1) ?Другими словами, я спрашиваю, нужно ли нам кодировать это следующим образом: temp также является переменной volatile, чтобы компилятор не кэшировал.

while( temp )
  temp = var + 1;

Ответы [ 2 ]

5 голосов
/ 21 марта 2012

Могу ли я добавить, что проверка такой переменной с использованием volatile в качестве средства защиты потока вовсе не достаточна для предотвращения возникновения различных и различных условий гонки.Если вы находитесь в многопоточном окружении, используйте правильные блокировки, атомарные и / или мьютексные структуры, чтобы захватывать и манипулировать вашими переменными.

3 голосов
/ 21 марта 2012

Это то же самое с точки зрения компилятора. Переменная volatile всегда должна быть перечитана из памяти при обращении к ней. Оценка var или var + 1 включает в себя доступ к var, и, следовательно, оба должны включать его чтение. Там нет разницы.

...