Выбор между темой: время истекло и пользовательский ввод

Я пишу простую функцию, которая при вызове позволяет выполнять 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;
}
}

0

Решение

Необходимость создания потока для таймера обычно является признаком неоптимального дизайна. Он плохо масштабируется (представьте тысячи таймеров), и код становится многопоточным и более сложным без веской причины. Также, sleep не ориентирован на многопотоковое исполнение в Linux.

Просто используйте одну нить с select и тайм-аут. select буду ждать STDIN_FILENO для ввода пользователя и тайм-аута одновременно.

Или лучше использовать стороннюю библиотеку демультиплексирования событий, например Libevent или же повышение :: ASIO.

0

Другие решения