Re[12]: [2]: : volatile: а можно примеры?
От: c-smile Канада http://terrainformatica.com
Дата: 20.01.05 22:31
Оценка:
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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.