У меня есть кроссплатформенная программа на C ++, в которой я использую библиотеки boost для создания асинхронного таймера.
У меня есть глобальная переменная:
bool receivedInput = false;
Один поток ожидает и обрабатывает ввод
string argStr;
while (1)
{
getline(cin, argStr);
processArguments(argStr);
receivedInput = true;
}
Другой поток запускает таймер, при котором обратный вызов вызывается каждые 10 секунд. В этом обратном вызове я проверяю, получил ли я сообщение
if (receivedInput)
{
//set up timer to fire again in 10 seconds
receivedInput = false;
}
else
exit(1);
. Это безопасно? Для чтения в потоке 2, я думаю, это не имеет значения, поскольку условие будет оцениваться как истинное или ложное. Но я не уверен, что произойдет, если оба потока попытаются установить значение ReceiveInput одновременно. Я также увеличил свой таймер в 3 раза по сравнению с ожидаемым периодом получения ввода, поэтому меня не беспокоит состояние гонки.
Изменить: Чтобы решить эту проблему, я использовал boost :: unique_lock, когда я устанавливал receiveInput, и boost :: shared_lock, когда я читал receiveInput. Я использовал пример из здесь