如何有效地使用std::线程来减少运行时间
how to use std::threads efficiently to reduce run time
我的代码如下:
int main()
{
thread t[10];
for (int i = 0;i < 10; i++)
t[i] = thread(print,i);//thread creation
for (int i = 0;i < 10; i++)
t[i].join();//waiting maiin to threads to cpmleate execution
cout << "in main";
}
void print(int i) {
cout<<"i:"<<endl;
}
这是最有效的方法,还是有更有效的方法来减少运行时间?
我想您想用线程做一项更复杂的工作。通过多线程可以获得的加速量取决于您的问题,并且不是所有类型的问题都可以并行化。如果你真的想深入探讨这个话题,有几本书是关于这个话题的。多线程编程不是一件容易的事情,而且有很多需要注意的地方。一些基本经验法则:
- 使用的线程数等于您拥有的处理器内核数。拥有更多没有优势
- 最小化线程之间的共享数据量。最理想的情况是,每个线程都应该处理独立的数据,因此没有同步开销。这通常是不可能的,但您应该尽可能少地使用同步
- 使用同步时,尽量减少互斥锁被锁定的时间
- 为了避免死锁,总是要锁定一定顺序的互斥对象。例如,如果在锁定A之后锁定互斥对象B,那么在B之后永远不会有锁定A的位置
还有很多其他的,这些都是我立刻想到的。
并行化的效率取决于多个因素(到目前为止还没有列出):
- 如何将您的问题拆分为子问题
- 子问题如何相互依赖(需要同步)
- 你的问题的限制因素是什么,是CPU、内存、磁盘
查看您的代码:C++11的thread
类通常用于较低级别的实现,例如实现线程池。对于您的问题,更高级别的方法,如async()
或run_once()
可能更适用。
如果你真的对这个主题感兴趣,你应该买一本关于这个主题的好书,例如Anthony Williams的《C++并发在行动》(他也在SO上)
相关文章:
- 为什么std::async使用同一个线程运行函数
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- 如何使线程运行现有类的函数?C++
- 使用 4 个和 8 个线程运行时执行的时间相等
- 在我调用join()之前,std ::线程运行
- C++线程安全时间计数类
- winsock连接调用崩溃如果多个线程运行,则在一个线程中正常工作
- 如何确保这部分代码仅由一个线程运行(在 openmp 中)
- 具有随机数总和的多线程执行时间
- 线程连接在另一个线程运行时会导致分段错误
- C++11 线程:剩余时间的睡眠
- 动态提升线程运行存储在具有共享指针的向量中的对象的方法
- 如何启动一个 boost::线程运行一个成员函数
- 如果由另一个 OpenMP 程序调用,则外部调用的 OpenMP 程序仅使用一个线程运行
- 线程运行时间最少
- 计算线程运行的次数
- MySQL C API:从不同线程运行查询时出现分段错误
- 使用两个线程运行和中断一个无限循环
- 与icc 14一起使用多线程运行时库时的错误
- 为什么我得到无限循环只有线程# 0后,所有5个线程运行多线程c++用餐哲学家谜语