C++ 线程:过期时间和用户输入之间的选择

C++ 线程:过期时间和用户输入之间的选择,c++,multithreading,getline,choice,C++,Multithreading,Getline,Choice,我正在编写一个简单的函数,当调用它时,它允许执行两个不同的操作 所以有两条线。用户选择等待,直到用户插入输入,时间选择等待,直到时间到期 选择_done shared var表示,如果为真,一个线程已经启动,阻塞它不会做任何事情!另一个;而thread_done则表示,如果为true,则该线程并不关心哪个线程已经完成,因此func将等待一个线程完成 这是代码。 在程序执行期间,func过程将被调用更多次 各种用户选择线程将永远在getline上等待!这是个问题吗?如果在程序调用func四次之后,

我正在编写一个简单的函数,当调用它时,它允许执行两个不同的操作

所以有两条线。用户选择等待,直到用户插入输入,时间选择等待,直到时间到期

选择_done shared var表示,如果为真,一个线程已经启动,阻塞它不会做任何事情!另一个;而thread_done则表示,如果为true,则该线程并不关心哪个线程已经完成,因此func将等待一个线程完成

这是代码。 在程序执行期间,func过程将被调用更多次

各种用户选择线程将永远在getline上等待!这是个问题吗?如果在程序调用func四次之后,用户没有插入任何内容,第五次用户插入yes,该怎么办? 每个用户选择线程都会继续执行吗??我怎样才能杀死等待的线程?还有其他解决办法吗

如何在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;           
    } 
}

必须为计时器创建线程通常是次优设计的标志。它不能很好地扩展,想象有数千个计时器,代码变得多线程且更加复杂,这是没有充分理由的。也

只需使用一个线程和一个超时。选择将同时等待用户输入和超时

或者,最好使用第三方事件解复用库,如或。

@gepeppe。当STDIN_FILENO准备好读取时,从它读取不会阻塞,但仍然需要使用非阻塞I/O来读取整行。