C++11 检测螺纹末端

C++11 检测螺纹末端,c++11,stdthread,stdasync,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();

我想在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, … */
    }
}
我的程序没有进入“run”方法中的“else”,程序在“this->thread->get()”上卡住,而状态为notload

我怎么办

谢谢

试试这个

while(!this->thread.valid())
{ //do smthg
}else{
}
get锁定,因为get希望检索将来此->线程的结果。因此,它会等待这个结果准备就绪,然后返回它

只要告诉你这个未来的结果是否准备好就可以了

试试这个

while(!this->thread.valid())
{ //do smthg
}else{
}
get锁定,因为get希望检索将来此->线程的结果。因此,它会等待这个结果准备就绪,然后返回它


有效只要告诉我这个未来的结果是否准备好了

我不确定问题出在哪里,但是这里有一个想法,使用
等待
():

#包括
#包括
#包括
结构状态
{
无效加载(){

std::cout我不确定问题出在哪里,但这里有一个使用
wait_for
()的主意:

#包括
#包括
#包括
结构状态
{
无效加载(){

std::cout这将导致100%的CPU使用率,同时在等待线程时也不做任何事情。是的,在做某事时,你会“做某事”,例如睡眠。我不知道在这个做某事代码中计划了什么,这仍然是一种非常“黑客”的做事方式。即使你使用了
sleep()
或者别的什么,现在线程可以恢复的时间有延迟,线程必须每隔一段时间唤醒一次,看看它是否可以恢复。为什么不让操作系统通知等待的线程呢?这是下一个标准的建议中目前讨论的一个问题。他们想为chain ac添加功能选项并添加关键字wait to do std::async(function1())。然后(function2())。请参阅isocpp.orgThank上sutter的建议,但它不起作用:/。
this->thread.valid()
从不返回true。(但是使用std::cout from
State::load
我可以看到我的方法已经到达了终点(State::load return true)。这将导致100%的CPU使用率,同时在等待线程时什么也不做。是的,在“做某事”中,你“做某事”,例如睡眠。我不知道在“做某事”代码中计划了什么,这仍然是一种非常“黑客”的做事方式。即使你使用了
sleep()
或者别的什么,现在线程可以恢复的时间有延迟,线程必须每隔一段时间唤醒一次,看看它是否可以恢复。为什么不让操作系统通知等待的线程呢?这是下一个标准的建议中目前讨论的一个问题。他们想为chain ac添加功能选项并添加关键字wait to do std::async(function1())。然后(function2())。请参阅isocpp.orgThank上sutter的建议,但它不起作用:/。
this->thread.valid()
从不返回true。(但是使用std::cout from
State::load
我可以看到我的方法已经到达了终点(State::load return true)。那么,您是否验证了
State::load()
将实际完成?是的,State::load将在3秒钟后结束,但“get”方法块执行。(在“else”中,我想设置加载程序的动画)我喜欢你给
future
命名为“线程”的方式。你知道,只是为了增加混淆:/stateInstance的类型是什么?'因为,如果它是一个对象或引用,你需要
std::ref()
。@sehe:Haha,它只是为了测试:)。stateInstance是一个状态指针(“State*stateInstance”作为参数),我尝试了使用和不使用
std::ref
,我的状态对象方法加载成功。只是我可以从
run
方法(
state::load
,加载高清纹理和文件,所以需要时间)。那么,您是否验证了
state::load()
将实际完成?是的,状态::加载结束~3秒后,但“get”方法块执行。(在“else”中,我想设置加载程序的动画)我喜欢你给
future
命名为“线程”的方式。你知道,只是为了增加混淆:/stateInstance的类型是什么?'因为,如果它是一个对象或引用,你需要
std::ref()
。@sehe:Haha,它只是为了测试:)。stateInstance是一个状态指针(“State*stateInstance”作为参数),我尝试了使用和不使用
std::ref
,我的状态对象方法加载成功。只是我可以从
run
方法检测方法的结束(
state::load
,加载高清纹理和文件,所以需要时间)。