ME>Во-первых, ты не привел кода, который мы просили привести: код, который использует ф-ции синхронизации для доступа к разделяемым переменным, но не работает когда эти разделяемые переменные не volatile.
Просили привести реальный код где работают volatile. Я привел.
Абстрактные примеры тебе тоже привели.
Для любого разумного человека они убедительны. По идее.
>> На моей задаче aliasing оптимизация дает 16% прирост производительности. Поэтому без этой оптимизации я даже и не компилирую.
>> http://terrainformatica.com/htmlayout
>>
>> Вот фрагмент кода который без volatile просто не компилируется: например метод locked::dec(volatile long& cnt);
ME>Вот тебе минимальный код, который вопреки твоим словам скомпилируется:
ME>ME>long l;
ME>locked::dec(l);
ME>
Нет, так как
struct locked
{
static long dec(volatile long& v)
{
return InterlockedDecrement(&v);
}
}
>> Использование критической секции вокруг mutex для проверки флагов active и terminate было протестировано и признано неоправданным — потеря производительности.
>>
>> Попытка использовать голые (не volatile) флаги вызывала очень странный behavior.
ME>Почему не использовались InterlockedCompareExchangeRelease для чтения значений разделяемых переменных?
А какая разница? Там их тоже volatile нужно обяъвлять
PVOID InterlockedCompareExchangePointer (
PVOID volatile *Destination, // destination address
PVOID Exchange, // exchange value
PVOID Comperand // value to compare
);
Я пишу реальные многоплатформенные конструкции.
Чем меньше внешних платформо зависимых функций тем мне легче.
volatile поддерживается и VC и GCC — т.е. это реальная платформонезависимость. Меня устраивает. И это работает.
ME>На мой взгляд, этот очень типичный образчик multithreaded кода, написанного в заблуждениях относительно volatile: никакого прироста производительности от использования volatile вместо ф-ций синхронизации не достигнуто, лишь прибавилось потенциальных проблем.
Знаешь, Макс, в моем багаже законченных продуктов
есть например специализированный FTP сервер который работает без перезагрузки машины
уже 14 месяцев с очень хорошим трафиком. Это я к тому что я примерно представляю как программировать multithreaded applications.
И кстати обрати внимание что тебе здесь оппонируют люди которые *реально* занимаются multithreading. emusic (респект) например.
>> Вообще когда multithreading нечто начинает вести себя странно — ищи где ты забыл поставить volatile.
ME>У меня есть чудесная мантра со 100% эффективностью от таких проблем:
ME>ME>Забудь про volatile, когда ты используешь multithreading.
Я не говорю что без volatile нельзя написать multihreading код.
Я говорю — volatile есть, описан в стандарте языка, поддерживается нужными мне компиляторами и реально помогает мне писать эффективный код (простой, надежный, human readable).
Естесственно ты волен и вправе остваться при своем мнении. Только
вот эту вот максиму "Забудь про volatile, когда ты используешь multithreading" ты лучше не пой на интервью по С++.
Тебя сразу спросят про как вызвать тогда InterlockedIncrement и тебе нужно будет долго объяснять "что конкретно ты имеешь ввиду".
Вот например как реализуются barriers c помощью volatile переменных:
http://docs.hp.com/en/B3909-90003/apas04.html