Я пишу простую функцию, которая при вызове позволяет выполнять 2 разных действия (исключая).
Итак, есть две темы. User_choice
ждет, пока пользователь не вставит ввод и Time_choice
ждет, пока не истечет время.
choice_done
shared var говорит, что если true, один поток уже запущен и блокирует (он ничего не делает!) другой; В то время как thread_done
говорит, что если истина, то поток (не имеет значения, какой) уже закончил, поэтому func()
ожидает окончания одного потока
Вот код
func
процедура будет вызываться больше раз во время выполнения программы.
Различные user_choice
поток будет ждать вечно getline
! Это проблема? Что делать, если через четыре раза программа позвонит func()
и пользователь ничего не вставляет, пятый раз пользователь вставляет «да»?
Будет каждый user_choice
нить продолжить выполнение ?? Как я могу убийство ожидающая нить? Есть ли другие решения?
Как я могу ждать внутри func()
что нить устанавливает thread_done
к правде?
bool choice_done = false;
bool thread_done = false;
void func(){
boost::thread t1(boost::bind( time_choice() ));
boost::thread t2(boost::bind( user_choice() ));
//whait untile thread_done == true
do something...
}
// Time choice thread
void time_choice(){
sleep(5);
if(choice_done == false){
printf("Automatic choice\n");
choice_done == true;
do something...
thread_done = true;
}
}// User choice thread
void user_choice(){
printf("Start emergency procedure?\n");
string tmp;
getline(cin, tmp);
if((tmp.compare("yes") == 0) && (choice_done == false)){
printf("Manual choice\n");
choice_done == true;
do something...
thread_done = true;
}
}
Необходимость создания потока для таймера обычно является признаком неоптимального дизайна. Он плохо масштабируется (представьте тысячи таймеров), и код становится многопоточным и более сложным без веской причины. Также, sleep
не ориентирован на многопотоковое исполнение в Linux.
Просто используйте одну нить с select
и тайм-аут. select
буду ждать STDIN_FILENO
для ввода пользователя и тайм-аута одновременно.
Или лучше использовать стороннюю библиотеку демультиплексирования событий, например Libevent или же повышение :: ASIO.