Булевский флаг переключается двумя потоками. Имеет ли смысл следующий код?
static bool ATOMIC_BOOL_READ( volatile bool& var )
{
return __sync_fetch_and_or(&var, 0);
}
static void ATOMIC_BOOL_WRITE(volatile bool& var, bool newval )
{
__sync_bool_compare_and_swap( &var, !newval, newval);
}
Обратите внимание на несколько вещей:
-
Я передаю ссылку bool. Имеют смысл?
-
Для удовольствия, я также объявляю его изменчивым.
- Функции статические
Update:
Основной вопрос, который я хочу задать: В чем разница между атомарностью и барьером памяти? Если Thread A выполняет атом, встроенный в переменную foo, то Thread B не может делать НИЖЕ на переменной foo; следовательно, создает барьер памяти?