如何有效地使用std::线程来减少运行时间

how to use std::threads efficiently to reduce run time

本文关键字:线程 运行时间 std 有效地      更新时间:2023-10-16

我的代码如下:

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上)