2014-07-17 75 views
0

我正在写一个简单的函数,当被调用时,它允许执行2个不同的动作(独占)。线程之间的选择:时间到期和用户输入

所以有两个线程。 User_choice一直等到用户插入输入并且Time_choice等待直到时间到期。

choice_done共享VAR说,如果是真的,一个线程已经开始,阻塞(它不会做任何事情!)另一种;而thread_done说,如果是真的,那个线程(哪个并不重要)已经完成了,所以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

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

只需使用一个线程与select和超时。 select将同时等待STDIN_FILENO用户输入和超时。或者,最好使用第三方事件解复用库,如libeventboost::asio

+0

谢谢,但使用该解决方案@gepeppe你这样做我不解决“函数getline”的问题... – gepeppe

+0

。当'STDIN_FILENO'准备好读取时,读取它不会被阻塞(但仍需要使用非阻塞I/O来读取整行)。 –

相关问题