std :: thread和在opengl应用程序中使用std :: cin输入

时间:2013-11-02 01:34:18

标签: c++ multithreading c++11 io stdthread

我使用一个线程,以便在OpenGL应用程序中为用户提供shell。

我的问题是我无法取消主循环结束时的线程,因为std :: thread没有提供取消方法,我的线程被std::cin >> var调用阻止,所以我不能使用布尔值来存储线程应该停止的事实。

我想知道在线程(std :: thread)或替代解决方案中是否有使用std :: cin的好方法。

1 个答案:

答案 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的链接,但如果没有这本书可能很难导航,这是一本很棒的读物。