Re[10]: [2]: : volatile: а можно примеры?
От: Andrew S Россия http://alchemy-lab.com
Дата: 18.01.05 20:07
Оценка:
>> а вот "недостаточно" "и поэтому ... бесполезен" — это действительно ересь хотя бы с точки зрения формальной логики

ME>Согласен, но с точки зрения треда — это оффтопик.


Максим, отнюдь. В исходном вопросе не содержится никаких предположений о том, каким образом меняется переменная одним из потоков. Для полноты изложения предположим, что это делается при помощи функции InterlockedXxx. Т.о. будет рассматривать "кошерную" синхронизацию, когда таки используются примитивы синхронизации.
Итак, чтобы больше не возникало подобных ответов, уточним условия:

1. Есть 2 или более потоков.
2. Есть разделяемая между ними переменная. long.
3. Запись (и пусть даже чтение) производится при помощи функций InterlockedExchange\InterlockedExchangeAdd или их аналогов.
4. Мы не привязываемся ни к конкретной архитектуре процессора, ни к конкретному компилятору.

Возможные варианты (V):

V1. Переменная объявлена как volatile. Соотв, параметры InterlockedXxx объявлены с volatile.
V2. Переменная объявлена не как volatile. Соотв, параметры InterlockedXxx без volatile (например, как это было в PSDK 2-х летней давности. Теперь это не так и вынуждает программистов использовать volatile для этих функций. Так что предположения о том, что этого не станут требовать разработчики компиляторов, очевидно, не оправдались).

Теперь некоторые соображения(A):

A1. Функции InterlockedXxx могут быть intrinsic (например, http://msdn.microsoft.com/library/en-us/vclang/html/vcrefCompilerIntrinsics.asp)
A2. Функции InterlockedXxx могут не быть intrinsic.

Интересуют Ваши (а не ссылки на группо-гугль, где, собственно, ничего нового нет) ответы на следующие вопросы:

(x) Случай Vx,Ax. Может ли в этом случае компилятор закэшировать значение переменной? Имеются в виду как обычные, так и наиболее агрессивные настройки оптимизации.
Итого, соотв, 4 варианта.

PS Мое мнение — volatile в данном аспекте необходимое, но не достаточное условие и должен использоваться для таких разделяемых переменных. По крайней мере, для случая Vx,A1.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.