1

我的代码如下:

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

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

4

2 回答 2

5

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

  • 使用等于您拥有的处理器内核数的线程数。拥有更多没有优势。
  • 尽量减少线程之间的共享数据量。理想情况下,每个线程都应该处理独立的数据,因此没有同步开销。这通常是不可能的,但您应该尽可能少地使用同步。
  • 使用同步时,尽量减少互斥锁的锁定时间。
  • 为了避免死锁,总是有一定的互斥锁顺序来锁定。例如,如果您在锁定 A 之后锁定了互斥体 B,那么在 B 之后永远不会有任何地方可以锁定 A。

还有很多其他的,这些只是我立即想到的。

于 2013-07-26T07:24:20.447 回答
1

并行化的效率取决于多个因素(到目前为止并非详尽的列表):

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

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

如果你真的对这个主题感兴趣,你应该买一本关于这个主题的好书,例如 Anthony Williams 的“C++ concurrency in Action”(他也在 SO 上)

于 2013-07-26T08:39:52.517 回答