业余爱好者无法理解标准::线程用法

Amateur can't understand std::thread usage

本文关键字:线程 用法 标准 业余爱好者      更新时间:2023-10-16

我特此原谅这样一个笼统的头衔。
我正在编写一个物理模拟应用程序,该应用程序使用 OpenGL 以 3D 形式显示数据,其中一个负责一些繁重计算的函数似乎会降低性能。我希望它们在"后台"完成,而不会冻结应用程序几秒钟。但是,std::thread似乎在我的情况下不起作用。
我尝试线程的函数中有很多计算,它在这里和那里分配一些内存,调用其他函数并使用类,如果这很重要的话。我创建了一个包装函数,我尝试从中启动一个线程:

void WrapperFunction(void)
{  
std::thread t(DoSomethingSerious);  
t.join();  
}

但是,它似乎没有任何效果,就像我直接打电话给DoSomethingSerious 一样。可能是什么问题?

join()等待线程完成,然后再继续。这就是加入线程的意义。

您有两种选择。

1)实例化一个std::thread,然后继续做任何其他需要做的事情,并且只有在完成所有操作后才加入线程。

2)detach()线程。分离的线程将继续独立执行,并且不能再联接。在这种情况下,您将不得不进行其他安排以等待线程停止。

但是,它似乎没有任何效果。

当然,主线程中的代码只是挂起,直到异步线程中的所有内容都完成。

如果在启动线程和执行join()之间有中间操作,则应注意效果

void WrapperFunction(void) {  
    std::thread t(DoSomethingSerious);  
    // Do something else in parallel
    t.join();  
}

那是因为你直接调用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();
}