我使用一个线程,以便在OpenGL应用程序中为用户提供shell。
我的问题是我无法取消主循环结束时的线程,因为std :: thread没有提供取消方法,我的线程被std::cin >> var
调用阻止,所以我不能使用布尔值来存储线程应该停止的事实。
我想知道在线程(std :: thread)或替代解决方案中是否有使用std :: cin的好方法。
答案 0 :(得分:1)
你可能想要的是一个中断线程,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的链接,但如果没有这本书可能很难导航,这是一本很棒的读物。