我特此赦免这样一个总标题 我正在编写一个物理模拟应用程序,它使用OpenGL以3D形式显示数据,其中一个负责一些繁重计算的函数似乎可以保持性能下降一点。我希望它们能够“在后台”完成而不会冻结应用程序几秒钟。但是,在我的情况下,std :: thread似乎不起作用 我试图线程的函数有很多计算,它在这里和那里分配一些内存,调用其他函数并使用类,如果这很重要。我已经创建了一个包装函数,我尝试从中创建一个线程:
void WrapperFunction(void)
{
std::thread t(DoSomethingSerious);
t.join();
}
然而,它似乎没有效果,就像我直接调用DoSomethingSerious一样。 可能是什么问题呢?
答案 0 :(得分:1)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="2000"
/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.1"
android:duration="2000"
/>
</set>
在继续之前等待线程完成。加入线程意味着什么。
您有两种选择。
1)实例化join()
,然后继续做其他需要完成的事情,只有在一切都完成后才加入线程。
2)std::thread
线程。分离的线程将继续独立执行,不能再连接。在这种情况下,您必须做出其他安排,等待线程停止。
答案 1 :(得分:1)
这是因为你直接致电t.join()
。 std::thread::join
函数等待以便线程在返回之前完成。正如您自己注意到的那样,效果是与调用函数没有区别。
更有用的是在线程创建和等待线程的位置之间做一些其他事情。像下面的伪代码:
void WrapperFunction(void)
{
// Create thread
std::thread t(DoSomethingSerious);
// Lots
// of
// code
// doing
// other
// things
// Wait for thread to finish
t.join();
}
答案 2 :(得分:1)
然而,似乎它没有效果。
当然,主线程中的代码只是暂停,直到异步线程中的所有内容都完成。
如果您在启动线程和执行join()
之间有中间操作,您应该注意效果:
void WrapperFunction(void) {
std::thread t(DoSomethingSerious);
// Do something else in parallel
t.join();
}