线程之间的选择:时间到期和用户输入

时间:2014-07-17 08:31:54

标签: c++ multithreading getline choice

我正在编写一个简单的函数,在调用时,允许执行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;           
    } 
}

1 个答案:

答案 0 :(得分:0)

必须为计时器创建线程通常是次优设计的标志。它不能很好地扩展(想象成千上万的计时器)并且代码变得多线程且更复杂,没有充分的理由。另外,sleep is not thread-safe on Linux

只需使用一个select的线程和超时。 select会在STDIN_FILENO等待用户输入并同时超时。

或者,更好的是,使用第三方事件解复用库,例如​​libeventboost::asio