Сотрудник и я пишу программное обеспечение для различных платформ, работающих на x86, x64, Itanium, PowerPC и других 10-летних серверных CPU.
Мы просто обсудили, достаточно ли функции мьютекса, такие как pthread_mutex_lock()... pthread_mutex_unlock(), или же должна быть уязвимой защищенная переменная.
int foo::bar()
{
//...
//code which may or may not access _protected.
pthread_mutex_lock(m);
int ret = _protected;
pthread_mutex_unlock(m);
return ret;
}
Моя забота - это кеширование. Может ли компилятор разместить копию _ защищенного в стеке или в регистре и использовать это устаревшее значение в присваивании? Если нет, что мешает этому? Являются ли вариации этого шаблона уязвимыми?
Я предполагаю, что компилятор фактически не понимает, что pthread_mutex_lock() является специальной функцией, поэтому мы просто защищены точками последовательности?
Большое спасибо.
Обновление: Хорошо, я вижу тенденцию с ответами, объясняющими, почему волатильность плоха. Я уважаю эти ответы, но статьи по этому вопросу легко найти в Интернете. То, что я не могу найти в Интернете, и причина, по которой я задаю этот вопрос, заключается в том, как я защищен без изменчивости. Если приведенный выше код верен, как он неуязвим для проблем кеширования?