我正在编写一个简单的函数,在调用时,允许执行2个不同的操作(独占)。
所以有两个主题。 User_choice
等待用户插入输入,Time_choice
等待时间到期。
choice_done
共享var表示,如果为true,则一个线程已经启动并阻塞(它没有做任何事情!)另一个线程;而thread_done
表示,如果为true,那个线程(无关紧要)已经完成,所以func()
等待一个线程完成。
这是代码。
在程序执行期间,func
过程将被调用更多次。
各种user_choice
线程将永远等待getline
!这是个问题吗?如果程序四次调用func()
并且用户未插入任何内容,第五次用户插入“是”,该怎么办?
每个user_choice
线程是否会继续执行?我如何杀死等待线程?还有其他解决方案吗?
如何在func()
内等待线程将thread_done
设置为true?
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 :(得分:0)
必须为计时器创建线程通常是次优设计的标志。它不能很好地扩展(想象成千上万的计时器)并且代码变得多线程且更复杂,没有充分的理由。另外,sleep
is not thread-safe on Linux。
只需使用一个select
的线程和超时。 select
会在STDIN_FILENO
等待用户输入并同时超时。
或者,更好的是,使用第三方事件解复用库,例如libevent或boost::asio。