Предположим, что есть два потока, выполняющих Thread1 ()
и Thread2 ()
соответственно. Поток 1 просто устанавливает глобальный флаг, чтобы сообщить потоку 2 о завершении, а поток 2 периодически проверяет, следует ли завершать работу.
volatile bool is_terminate = false;
void Thread1()
{
is_terminate = true;
}
void Thread2()
{
while (!is_terminate) {
// ...
}
}
Я хочу спросить, безопасен ли приведенный выше код, предполагая, что доступ к is_terminate
атомарный . Я уже знаю, что многие материалы утверждают, что volatile
не может обеспечить потокобезопасность в целом. Но в ситуации, когда используется только одна атомарная переменная, действительно ли нам нужно защищать общую переменную с помощью блокировки?
Это не потокобезопасно.
Если потоки, например, запускаются на процессорах с отдельными кэшами, нет никаких языковых правил, говорящих о том, что кеши должны быть синхронизированы при записи переменной типа volatile. Другой поток может не увидеть изменения в течение очень долгого времени, если вообще когда-либо.
Чтобы ответить по-другому:
Если volatile
достаточно для обеспечения безопасности потоков, почему C ++ 0x добавляет целую главу с атомарными операциями?
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2047.html