unsigned long xxx_read(void)
{
static unsigned long old = 0;
unsigned long tmp;
.....
while(...) {
...
tmp = old;
...
}
.....
}
-------------------------
Какое значение записывается в данном случае в переменную tmp? Возможные варианты: значение old на момент входа в функцию, значение old в момент присваивания, значение в какой-то промежуточный момент. Что говорит по этому поводу стандарт? И что на деле генерируют компиляторы?
С дополнительным ключевым словом volatile поведение, как мне кажется, более предсказуемо. Впрочем, если ошибаюсь, готов заслушать ваши мнения.
*Ясен пень, функция может вызываться параллельно
**Вопрос не про блокировки. Но если в комментарии очень хочется про них написать, запретить, конечно, я не могу :)