Date: 2011-11-13 10:04 am (UTC)
в соответствии с вышеизложенным спеком, функция f1 может никогда не окончиться. )))

это нарушение side effects.

Accessing an object designated by a volatile lvalue (_basic.lval_),
modifying an object, calling a library I/O function, or calling a
function that does any of those operations are all side effects, which
are changes in the state of the execution environment. Evaluation of
an expression might produce side effects. At certain specified points
in the execution sequence called sequence points, all side effects of
previous evaluations shall be complete and no side effects of subse-
quent evaluations shall have taken place

То есть программа сама *обязательно* увидит изменение переменной (кроме случаев типа a[i] = i++), а вот внешний наблюдатель (в том числе другой тред) - не факт.

Стандарт 2003 года вообще никак не специфицирует работу с тредами.
Observable behaviour - это не то, что видят треды друг у друга, а то что видит "внешний наблюдатель", скажем, устройтсво в volatile регистры которого пишет программа или операционная система, функции ввода-вывода которой вызываются.


в том то все и дело, что это единственные доступные для другого треда гарантии состояния памяти, иных просто нет в рамках языка.
из этого как бы вытекает необходимость в расширениях типа asm volatile("" ::: "memory"); или _ReadWriteBarrier().
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting