Здравствуйте, Seriously Serious, Вы писали:
SS>От этого всего у меня вопросы: SS>1) Гарантируется ли что-нибудь относительно порядка вызова функций синхронизации? или компилятор тут тоже может оптимизировать как захочет?
Гарантируется. После вызова "непрозрачной" ф-ции компилятор будет перечитывать значения всех переменных из памяти. В противном случае даже single threaded код работать не будет.
У компилятора просто нет никакой возможности установить, что изменяет "непрозрачная" ф-ция. К примеру, C++ runtime может сохранить адреса всех глобальных переменных и любая "непрозрачная" ф-ция может изменить значение какой либо глобальной переменной не принимая ее адреса явно в качестве параметра вызова. Компилятору знание об эффектах "непрозрачных функций" недоступно, поэтому ему придется перечитывать все переменные из памяти.
Ok, компилятору, обычно, известны эффекты всех ф-ций, которые выполняет его же C++ runtime, но это был лишь пример, и вместо C++ runtime может выступать любой C/C++ API, к исходникам которого у компилятора нет доступа.
SS>2) Имеет ли право компилятор все переменные держать в регистрах? (где об этом в стандарте сказано?)