Re[8]: volatile у переменной класса
От: vanishing  
Дата: 22.06.05 06:19
Оценка: 2 (2) +2
E>А что ему мешает их вставлять, интересно? Не вставляет — такова реализация. Но барьеры без volatile особого смысла не имеют. Если программа с глубокой оптимизацией и параллелизмом правильно работает без volatile — это либо недостатки компилятора, либо счастливое стечение обстоятельств.

ну. это вы погорячились. по работе постоянно приходится писать программы с глубокой оптимизацией и параллелизмом. и ещё ни разу не пришлось воспользоваться volatile. ибо единственное место, где эти переменные полезны — это всякие там подобия флажков. но это такой бедный и не гибкий механизм синхронизации, что используется очень и очень редко. в моём случае никогда. кроме этого по своему хобби знаю, что и в ядре ОС можно преспокойно обойтись без подобных переменных. просто надо правильно проектировать архитектуру. вот тут, конечно, я не очень понимаю, зачем автору такая переменная понадобилась, но вот распределённый счётчики, который тут упоминались или флажки done — не самое лучшее решение. ибо активное ожидание или подсчёт не каких-то событий, а количеств исполнения инструкции добавления значения — это очевидное зло.

E>То есть, значение выражения является его основным результатом, а отнюдь не побочным эффектом. И ничто не

E>У тебя — ерунда, на деле — истина

ME>> На POSIX все барьеры работают без volatile.


E>Что значит "на POSIX"? С каких пор POSIX стал как-то влиять на особенности оптимизации сишного кода? Это, как ты выразился в отношении i86 — стечение обстоятельств.


это не стечение обстоятельств : ). по опыту знаю, что на alpha, powerpc и xscale всё тоже корректно работает. просто это ведь очевидно. если в функцию примитива синхронизации передаётся указатель на переменную, то, какой бы ни была оптимизация в компиляторе, он просто обязан значение этой переменной сохранить в память, а затем уже вызывать функцию. дальнейшее — дело техники и специфичной для неё реализации примитива синхронизации. если же речь о глобальных переменных, то опять же. компилятор си (это особенность языка) не может знать, с какими именно ячейками в глобальной памяти будет работать та или иная функция, особенно, если речь идёт о вызове функции из другого модуля. поэтому все глобальные переменные, в том числе и static (чёрт ведь знает, куда что указывает) опять сохраняются в память. соответсвенно, после вызова функций, обращения к ним включают чтение из памяти.

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