C++ 如何有效地使用std::threads来减少运行时间
我的代码如下:C++ 如何有效地使用std::threads来减少运行时间,c++,multithreading,c++11,parallel-processing,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 pr
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;
}
intmain()
{
螺纹t[10];
对于(int i=0;i<10;i++)
t[i]=线程(打印,i);//线程创建
对于(int i=0;i<10;i++)
t[i].join();//等待线程执行cpmleate
cout我假设你想用线程做一个更复杂的工作。多线程的加速程度取决于你的问题,并不是所有的问题都可以并行处理。如果你真的想深入探讨这个主题,有几本书是关于这个主题的。多线程编程不是一件容易的事情,而且有很多你必须注意很多注意事项。一些基本经验法则:
- 使用与处理器内核数量相等的线程数量。拥有更多线程没有任何优势
- 尽量减少线程之间的共享数据量。最佳情况下,每个线程应处理独立的数据,因此没有同步开销。这通常是不可能的,但应尽可能少地使用同步
- 使用同步时,尽量减少锁定互斥锁的时间
- 为避免死锁,请始终锁定特定顺序的互斥体。例如,如果在锁定a后锁定互斥体B,则永远不会有在B后锁定a的位置
还有很多其他的问题,这些只是我脑海中立即浮现的问题。我想你想用线程做一个更复杂的工作。多线程的加速程度取决于你的问题,并不是所有类型的问题都可以并行。如果你真的想深入探讨。多线程编程不是一件容易的事情,而且有很多需要注意的事项。一些基本经验法则:
- 使用与处理器内核数量相等的线程数量。拥有更多线程没有任何优势
- 尽量减少线程之间的共享数据量。最佳情况下,每个线程应处理独立的数据,因此没有同步开销。这通常是不可能的,但应尽可能少地使用同步
- 使用同步时,尽量减少锁定互斥锁的时间
- 为避免死锁,请始终锁定特定顺序的互斥体。例如,如果在锁定a后锁定互斥体B,则永远不会有在B后锁定a的位置
还有很多其他问题,这些只是我脑海中立即浮现的问题。并行化的效率取决于多个因素(到目前为止,非呼气列表):
- 如何将您的问题分解为子问题
- 子问题如何相互依赖(需要同步)
- 您的问题的限制因素是什么,是CPU、内存、磁盘
查看您的代码:C++11的thread
类通常用于较低级别的实现,例如实现线程池。对于您的问题,较高级别的方法,如async()
或run\u once()
可能更适用
如果你真的对这个主题感兴趣,你应该获得一本关于这个主题的好书,例如Anthony Williams的《C++并发操作》(他也是如此)并行化的效率取决于多个因素(到目前为止,还没有列出):
- 如何将您的问题分解为子问题
- 子问题如何相互依赖(需要同步)
- 您的问题的限制因素是什么,是CPU、内存、磁盘
查看您的代码:C++11的thread
类通常用于较低级别的实现,例如实现线程池。对于您的问题,较高级别的方法,如async()
或run\u once()
可能更适用
如果你真的对这个主题感兴趣,你应该获得一本关于这个主题的好书,例如Anthony Williams写的《C++并发操作》(他也是如此)对于这样一个简单的例子,速度可能会慢一些,因为您需要先创建线程,然后操作系统需要在更多线程之间切换。但最大的瓶颈是输出。输出通常(相对而言)是缓慢,从多个线程执行可能不会加快速度。您当前的运行时间如何?是否比您预期的运行时间慢很多?您是否认为当前代码中存在一些您怀疑没有给您带来最有效结果的内容?所显示的代码永远无法从添加线程中获益。线程必须等待彼此恢复写入cout
(请注意,通常您必须执行显式同步,但对于std::cout
,标准提供了一些特定的保证)。对于这样一个简单的示例,它可能会更慢,因为您需要先创建线程,然后操作系统需要在更多线程之间切换。但这里最大的瓶颈是输出。输出通常(相对而言)缓慢,从多个线程执行可能不会加快速度。您当前的运行时间如何?是否比您预期的运行时间慢很多?您是否认为当前代码中存在一些您怀疑没有给您带来最有效结果的内容?所显示的代码永远无法从添加线程中获益。线程必须等待彼此恢复写入cout
(请注意,通常您必须执行显式同步,但对于std::cout
,标准提供了一些特定的保证).“使用与处理器核心数量相等的线程数。拥有更多的线程没有优势”-错误。@MartinJames你能解释一下原因吗?你漏掉了“就绪”一词:“使用与处理器核心数量相等的就绪线程数。拥有更多的线程没有优势”。如果线程是I/O bo