2015-02-10 177 views
0

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

在调用线程的功能,我有一个while循环,它在一个阵列,其大小是线程数创建线程(让我们说“TN”)。每次创建线程时,我都会执行一个for循环来加入它们。 (在pthread_join)。虽然运行很多次(不仅仅是4次)。

什么可能是错的?

+0

顺序,而不是运行在运行您使用的是互斥访问地图? – tohava 2015-02-10 15:56:42

+4

我的魔法8球说错误在第42行。[即不可能甚至猜测根据代码可能或不可以做的部分的高级描述。] – 2015-02-10 15:58:05

+0

慢多少?您是否在使用可以从多个线程中受益的体系结构? – odedsh 2015-02-10 15:58:43

回答

5

如果你正在运行一个小的琐碎程序这往往是因为工作启动线程的情况下,优先安排,运行,上下文切换,然后同步实际上可能需要更多的时间,然后运行它作为一个单一的过程。

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

+0

每个线程都将一个非常大的文本作为参数。它将其标记并将其词语添加到地图中。线程创建一个临时地图。然后,当它完成标记时,它会将临​​时映射添加到常用映射中。我有4个内核。时间乘以〜4。但我试图删除有关地图的代码,只保留标记...但仍然 – user3309479 2015-02-10 16:05:31

+3

@ user3309479你忘了在问题中提到。 – user2079303 2015-02-10 16:06:36

+1

@ user2079303:该映射必须与互斥锁同步,以便一次只有一个线程可以使用它。因此,你的代码被序列化,线程不能帮你。 – 2015-02-10 16:08:23

0

没有看到代码,很难说清楚,但可能有一些问题。

你的线程可能没有足够的工作来证明他们的创作。创建和运行线程很昂贵,所以如果你的工作量太小,他们不会为自己付出代价。

执行时间可以花在大多做内存访问的地图上,在这种情况下互斥的线程意味着,你是不是真的这样做实际上很多并行工作(Amdahl定律)。

0

当运行multitthreaded程序,每个线程将依次根据给定的CPU时钟处理。

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

现在,鉴于你(最有可能)有一个核心两个线程,尽量保持在向CPU产生的开销记:

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

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

当你需要一个异步操作时(也就是说你不想等待一个rezult,比如从一个url加载一个图像或者从HDD那里加载一个比慢速ram更流畅的几何图形),多线程就派上用场了。

在这样的情况下,应用多线程会导致更好的用户体验,因为你的程序将不挂了,当一个缓慢的操作occurrs。

+0

这个答案似乎有点过时了。现在大多数系统都有多个内核。 – 2015-02-10 16:06:53

+0

你可以考虑这个。但是,如果你有更多的线程,然后核心数量,你会碰到同样的问题。更重要的是,大多数操作系统都运行多个进程,每个进程都有自己的线程系统。不可避免地,你会在一个CPU问题上遇到多个线程,这会根据优先级为每个线程分配CPU时钟。 – MichaelCMS 2015-02-10 16:25:14

0

如果大部分代码是一个互斥体,将在parllel