【问题标题】:std::thread and input with std::cin in an opengl applicationstd::thread 并在 opengl 应用程序中使用 std::cin 输入
【发布时间】:2013-11-13 07:39:31
【问题描述】:

我在 OpenGL 应用程序中使用线程为用户提供外壳。

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

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

【问题讨论】:

  • 你的话题是分离还是加入
  • 无。如果我调用 thread.join() 应用程序将等待线程结束,但线程被 std::cin 调用阻塞。我可能不明白什么是分离线程(像 fork() 那样分离当前进程?)
  • 听起来像是join了,在c++11中创建一个线程后,你要么调用join,要么对其进行分离
  • 你必须使用>>阅读吗?异步 io 调用可能会有所帮助(如果没有标准化)。
  • 是的,我使用>>,但我发现了一些东西:当我在我编写的 ThreadClass 的构造函数中分离线程时,我遇到了问题;当我在主循环中分离它时,它会随机工作:如果线程在分离之前开始执行,则它不起作用,否则它会起作用。

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


【解决方案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 的链接,尽管没有这本书可能很难导航,顺便说一句,这是一本很棒的书。

【讨论】:

  • 谢谢!这是我需要的。
  • @KerrekSB:它告诉我我的线程中需要一个实例,它将发送异常。
  • internal_thread=std::thread([f,&amp;p] ... -> 我需要向我的线程发送一个“指向指向标志的指针的指针”,然后线程初始化地址。
  • flag can be read uninitialized because of the check that it's initialized, 至于它有什么帮助我不得不承认我没有仔细阅读它但记得我在书中看到它, 我虽然他需要做的就是从 main 中断线程
  • @KerrekSB 你知道 impl 可能不是 100% 完成的,因为我看了它
猜你喜欢
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多