业余爱好者无法理解标准::线程用法
Amateur can't understand std::thread usage
我特此原谅这样一个笼统的头衔。
我正在编写一个物理模拟应用程序,该应用程序使用 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();
}
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- 异步处理设备的高级线程用法
- 如何在多线程中关闭 malloc() 的 mmap 用法?
- Boost:创建一组线程并等待所有线程的正确习惯用法是什么
- std::map 的线程安全用法
- std::线程管理:用法和最佳实践
- 如何确保始终存在给定数量的线程?(另外,这是线程的良好用法吗?
- 多线程中的singleton用法
- 语义问题 "Attempt to use a deleted function" 遇到使用 std::线程用法编译 c++ 代码
- 业余爱好者无法理解标准::线程用法