C++11 检测螺纹末端
我想在c++11中检测线程结束,但我不知道怎么做,它看起来像“get”块程序,下面是我所做的: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();
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 fromState::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 fromState::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
,加载高清纹理和文件,所以需要时间)。