В результате моего ответа на на этот вопрос я начал читать о ключевом слове 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
в этом конкретном случае заключается просто в том, чтобы избежать какой-либо оптимизации, которая могла бы кэшироватьэто в регистре для цикла.Следовательно, в результате получается бесконечный цикл.Нет необходимости правильно синхронизировать вещи, потому что рабочий поток в конечном итоге получит новое значение?
Я хотел бы понять, считается ли это совершенно неправильным и правильный ли подход - использоватьсинхронизированная переменная? Есть ли разница между компилятором / архитектурой / ядрами?Может быть, это просто неаккуратный подход, которого стоит избегать?
Я был бы рад, если бы кто-то разъяснил это.Спасибо!
РЕДАКТИРОВАТЬ
Мне было бы интересно увидеть (в коде), как вы решите эту проблему.