检测线程结束

时间:2013-09-02 21:06:16

标签: c++11 stdthread stdasync

我想在c ++ 11中检测线程结束,但我不知道该怎么做,它看起来像是“get”块程序,这就是我所做的:

void Object::init()
{
    this->thread = std::async( std::launch::async, &State::load, stateInstance );
}

/* A method in a loop */
void Object::run()
{
    bool ready = this->thread.get();
    if( ready )
    {
      /* do something */
    }
    else
    {
       /* draw interface, manage event, … */
    }
}

我的程序没有进入“运行”方法中的“else”,程序停留在“this-> thread-> get()”状态,而状态未加载。

我该如何处理?

谢谢!

2 个答案:

答案 0 :(得分:1)

我不确定问题是什么,但是这是一个使用wait_forcompiled on Coliru)的想法:

#include <future>
#include <chrono>
#include <iostream>

struct State
{
    void load() { 
        std::cout << "working\n";
        std::this_thread::sleep_for(std::chrono::seconds(4));
        std::cout << "done\n";
    }
};

struct Object
{
    /* A method in a loop */
    bool run()
    {
        switch(future.wait_for(std::chrono::milliseconds(100)))
        {
            case std::future_status::ready:
                {
                    /* do something */
                }
                return false;
            case std::future_status::timeout:
                {
                    /* draw interface, manage event, … */
                }
            case std::future_status::deferred:
            default:
                return true;
        }
    }

    Object()  { init(); }
    ~Object() { if (future.valid()) future.wait(); }
  private:
    void init()
    {
        future = std::async(std::launch::async, &State::load, &stateInstance);
    }

    State stateInstance;
    std::future<void> future;
};

int main()
{
    Object test;

    while (test.run());
}

答案 1 :(得分:0)

试试这个

while(!this->thread.valid())
{ //do smthg
}else{
}

你的get lock,因为get想要检索未来的结果 - &gt;线程。因此它会等待这个结果准备就绪,并将其返回。

有效,只需判断此未来结果是否准备就绪