我在 OpenGL 应用程序中使用线程为用户提供外壳。
我的问题是我无法在主循环结束时取消线程,因为 std::thread 没有提供取消方法,并且我的线程被std::cin >> var
调用阻塞,所以我不能使用布尔值来存储线程应该停止的事实。
我想知道是否有在线程中使用 std::cin 的好方法(std::thread)或替代解决方案。
我在 OpenGL 应用程序中使用线程为用户提供外壳。
我的问题是我无法在主循环结束时取消线程,因为 std::thread 没有提供取消方法,并且我的线程被std::cin >> var
调用阻塞,所以我不能使用布尔值来存储线程应该停止的事实。
我想知道是否有在线程中使用 std::cin 的好方法(std::thread)或替代解决方案。
你可能想要的是一个中断线程,c++ 没有给你一个,但是c++ 并发有一个简单的实现。这可能是你需要的。如果 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();
}
}
};
现在您可以轻松地从主线程中取消线程。我放了这本书的链接,但书中的所有代码也是免费在线的。这是本书中源代码的链接,尽管没有这本书可能很难导航,顺便说一句,这是一本很好的阅读书。