2014-07-17 71 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來讀取整行)。 –

相關問題