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

时间:2013-07-26 07:02:38

标签: c++ multithreading c++11 parallel-processing

我的代码如下:

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;
}

这是最有效的方式,还是有更有效的方法来减少运行时间?

2 个答案:

答案 0 :(得分:5)

我假设你想用线程做一个更复杂的工作。多线程可以获得的加速量取决于您的问题,而不是所有类型的问题都可以并行化。如果您真的想深入探讨这本主题,​​有几本关于这个主题的书籍。多线程编程并不是一件容易的事情,你必须要注意许多警告。一些基本的经验法则:

  • 使用的线程数等于您拥有的处理器核心数。拥有更多没有优势。
  • 最小化线程之间的共享数据量。最佳地,每个线程应该处理独立的数据,因此没有同步开销。这通常是不可能的,但你应该尽可能少地使用同步。
  • 使用同步时,最小化互斥锁被锁定的时间。
  • 为避免死锁,始终要有一定数量的互斥锁才能锁定。例如,如果在锁定A后锁定互斥锁B,则在B之后永远不会有任何锁定A的位置。

还有很多其他的,这些只是我脑海中立刻想到的。

答案 1 :(得分:1)

并行化的效率取决于多种因素(迄今为止非详尽无遗的列表):

  • 如何将问题分解为子问题?
  • 子问题如何相互依赖(需要同步)?
  • 你的问题的限制因素是什么,是CPU,内存,磁盘......?
  • ...

查看代码:C ++ 11的thread类通常用于较低级别的实现,例如:实现线程池。对于您的问题,更高级别的方法(例如async()run_once())可能更适用。

如果你真的对这个主题感兴趣,你应该获得一本关于这个主题的好书,例如:安东尼威廉姆斯的“行动中的C ++并发”(他也在SO上)