我使用線程爲了在OpenGL應用程序中爲用戶提供一個shell。std ::線程和輸入與std :: cin在opengl應用程序
我的問題是,我不能取消線程在我的主循環結束,因爲std ::線程不提供取消方法,我的線程被阻止與std::cin >> var
調用,所以我不能使用布爾值來存儲線程應該停止的事實。
我想知道在線程(std :: thread)或其他解決方案中使用std :: cin是否有很好的方法。
我使用線程爲了在OpenGL應用程序中爲用戶提供一個shell。std ::線程和輸入與std :: cin在opengl應用程序
我的問題是,我不能取消線程在我的主循環結束,因爲std ::線程不提供取消方法,我的線程被阻止與std::cin >> var
調用,所以我不能使用布爾值來存儲線程應該停止的事實。
我想知道在線程(std :: thread)或其他解決方案中使用std :: cin是否有很好的方法。
你可能想要的是一箇中斷線程,C++不會給你一個,但c++ concurrency in action有一個簡單的實現。這可能是你需要的。如果boost還有一個,因爲這本書是由線程庫的維護者編寫的,所以不會感到驚訝。
class interrupt_flag
{
public:
void set();
bool is_set() const;
};
thread_local interrupt_flag this_thread_interrupt_flag;
class interruptible_thread
{
std::thread internal_thread;
interrupt_flag* flag;
public:
template<typename FunctionType>
interruptible_thread(FunctionType f)
{
std::promise<interrupt_flag*> p;
internal_thread=std::thread([f,&p]{
 p.set_value(&this_thread_interrupt_flag);
f();
});
flag=p.get_future().get();
}
void interrupt()
{
if(flag) {
flag->set();
}
}
};
現在您可以輕鬆取消您的主線程。我給這本書寫了一個鏈接,但書中的所有代碼也都是免費在線的。這裏有一個鏈接到source code這本書,雖然它可能很難瀏覽沒有這本書,這是一個很好的閱讀順便說一句。
這段代碼如何提供幫助? –
謝謝!這是我需要的。 –
@KerrekSB:它顯示我需要一個實例在我的線程中,它會發送異常。 –
是你的線程分離或加入 – aaronman
無。如果我調用thread.join(),應用程序將等待線程的結束,但線程被std :: cin調用阻塞。我可能不明白什麼是分離線程(與fork()分離當前進程?) –
聽起來像它的加入,在C++ 11中創建一個線程後,你要麼加入或分離它 – aaronman