В результате моего ответа на этот вопрос я начал читать о ключевом слове volatile
и о том, что касается его консенсуса. Я вижу, что есть много информации об этом, какой-то старый, который сейчас кажется неправильным, и много нового, в котором говорится, что почти нет места в многопоточном программировании. Следовательно, я хотел бы уточнить конкретное использование (не смог найти точный ответ здесь на SO).
Я также хочу отметить, что я понимаю требования для написания многопоточного кода в целом и почему volatile
не решает ничего. Тем не менее, я вижу код, использующий volatile
для управления потоками в базовых кодах, в которых я работаю. Кроме того, это единственный случай, когда я использую ключевое слово volatile
, так как все остальные общие ресурсы правильно синхронизированы.
Скажем, у нас есть класс вроде:
class SomeWorker
{
public:
SomeWorker() : isRunning_(false) {}
void start() { isRunning_ = true; /* spawns thread and calls run */ }
void stop() { isRunning_ = false; }
private:
void run()
{
while (isRunning_)
{
// do something
}
}
volatile bool isRunning_;
};
Для простоты некоторые вещи не учтены, но важно то, что создается объект, который делает что-то в недавно порожденном потоке, проверяя логическое (volatile
) логическое значение, чтобы знать, следует ли его остановить. Это логическое значение устанавливается из другого потока, когда он хочет, чтобы рабочий остановился.
Я понял, что причина использования volatile
в этом конкретном случае - это просто избежать любой оптимизации, которая будет кэшировать ее в регистре для цикла. Следовательно, приводя к бесконечному циклу. Нет необходимости правильно синхронизировать вещи, потому что рабочий поток в конечном итоге получит новое значение?
Я хотел бы понять, если это считается совершенно неправильным, и если правильный подход заключается в использовании синхронизированной переменной? Есть ли разница между компилятором/архитектурой/ядрами? Может быть, это просто небрежный подход, которого стоит избегать?
Буду рад, если кто-то разъяснит это. Спасибо!
ИЗМЕНИТЬ
Мне было бы интересно увидеть (в коде), как вы решите это решить.