C ++ Pthreads - 多线程比单线程慢

时间:2015-02-10 15:53:51

标签: c++ multithreading performance pthreads posix

我正在使用pthreads库开发一个C ++应用程序。程序中的每个线程都访问一个公共的unordered_map。程序运行速度慢于4个线程而不是1.我评论了线程中的所有代码,并且只留下了标记字符串的部分。单线程执行仍然更快,所以我得出的结论是地图不是问题所在。 之后我在屏幕上打印了线程'它们似乎按顺序执行。

在调用线程的函数中,我有一个while循环,它在一个数组中创建线程,其大小是线程数(让我们说' tn')。每次创建线程时,我都会执行for循环来加入它们。 (在pthread_join)。虽然多次运行(不仅仅是4次)。

可能有什么问题?

4 个答案:

答案 0 :(得分:5)

如果你正在运行一个简单的小程序,这往往是这种情况,因为启动线程,调度优先级,运行,上下文切换,然后同步的工作实际上可能需要更多的时间,然后将其作为单个进程运行。

这里的要点是,在处理琐碎的问题时,它可能会运行得更慢。但另一个因素可能是你的CPU实际拥有多少个核心。

答案 1 :(得分:0)

如果没有看到代码,很难确定,但可能存在许多问题。

你的主题可能没有做足够的工作来证明他们的创作。创建和运行线程非常昂贵,因此如果您的工作量太小,他们就不会为自己买单。

执行时间主要用于在地图上进行内存访问,在这种情况下,相互排除线程意味着你实际上并没有在实践中做太多的并行工作(Amdahl定律)。

答案 2 :(得分:0)

运行多线程程序时,将根据给定的CPU时钟顺序处理每个线程。

如果您有多个核心,您将只有真正的多线程。在这种情况下,唯一的多线程将是1个线程/核心。

现在,鉴于您(很可能)在一个核心上同时拥有两个线程,请尽量记住为CPU生成的开销:

  • 为每个线程分配不同的时钟时间
  • 将线程访问同步到各种内部CPU操作
  • 其他线程优先级操作

换句话说,对于一个简单的应用程序,多线程实际上是性能方面的降级。

当您需要异步操作时,多线程会派上用场(意味着您不想等待重复操作,例如从网址加载图像或从硬盘驱动器中流式传输比较慢的RAM)。

在这种情况下,应用多线程将带来更好的用户体验,因为当发生缓慢操作时,您的程序不会挂起。

答案 3 :(得分:0)

如果您的大多数代码都在互斥锁下运行,那么它将以串行方式运行,而不是以parllel方式运行