Энергозависимая и многопоточность: является ли следующий потокобезопасным?

Предположим, что есть два потока, выполняющих Thread1 () и Thread2 () соответственно. Поток 1 просто устанавливает глобальный флаг, чтобы сообщить потоку 2 о завершении, а поток 2 периодически проверяет, следует ли завершать работу.

volatile bool is_terminate = false;

void Thread1()
{
    is_terminate = true;
}

void Thread2()
{
    while (!is_terminate) {
        // ...
    }
}

Я хочу спросить, безопасен ли приведенный выше код, предполагая, что доступ к is_terminate атомарный . Я уже знаю, что многие материалы утверждают, что volatile не может обеспечить потокобезопасность в целом. Но в ситуации, когда используется только одна атомарная переменная, действительно ли нам нужно защищать общую переменную с помощью блокировки?

22
задан Hosam Aly 6 July 2011 в 10:12
поделиться

1 ответ

Это не потокобезопасно.

Если потоки, например, запускаются на процессорах с отдельными кэшами, нет никаких языковых правил, говорящих о том, что кеши должны быть синхронизированы при записи переменной типа volatile. Другой поток может не увидеть изменения в течение очень долгого времени, если вообще когда-либо.


Чтобы ответить по-другому:

Если volatile достаточно для обеспечения безопасности потоков, почему C ++ 0x добавляет целую главу с атомарными операциями?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2047.html

11
ответ дан 29 November 2019 в 04:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: