我正在使用pthreads库开发一个C ++应用程序。程序中的每个线程都访问一个公共的unordered_map。程序运行速度慢于4个线程而不是1.我评论了线程中的所有代码,并且只留下了标记字符串的部分。单线程执行仍然更快,所以我得出的结论是地图不是问题所在。 之后我在屏幕上打印了线程'它们似乎按顺序执行。
在调用线程的函数中,我有一个while循环,它在一个数组中创建线程,其大小是线程数(让我们说' tn')。每次创建线程时,我都会执行for循环来加入它们。 (在pthread_join)。虽然多次运行(不仅仅是4次)。
可能有什么问题?
答案 0 :(得分:5)
如果你正在运行一个简单的小程序,这往往是这种情况,因为启动线程,调度优先级,运行,上下文切换,然后同步的工作实际上可能需要更多的时间,然后将其作为单个进程运行。
这里的要点是,在处理琐碎的问题时,它可能会运行得更慢。但另一个因素可能是你的CPU实际拥有多少个核心。
答案 1 :(得分:0)
如果没有看到代码,很难确定,但可能存在许多问题。
你的主题可能没有做足够的工作来证明他们的创作。创建和运行线程非常昂贵,因此如果您的工作量太小,他们就不会为自己买单。
执行时间主要用于在地图上进行内存访问,在这种情况下,相互排除线程意味着你实际上并没有在实践中做太多的并行工作(Amdahl定律)。
答案 2 :(得分:0)
运行多线程程序时,将根据给定的CPU时钟顺序处理每个线程。
如果您有多个核心,您将只有真正的多线程。在这种情况下,唯一的多线程将是1个线程/核心。
现在,鉴于您(很可能)在一个核心上同时拥有两个线程,请尽量记住为CPU生成的开销:
换句话说,对于一个简单的应用程序,多线程实际上是性能方面的降级。
当您需要异步操作时,多线程会派上用场(意味着您不想等待重复操作,例如从网址加载图像或从硬盘驱动器中流式传输比较慢的RAM)。
在这种情况下,应用多线程将带来更好的用户体验,因为当发生缓慢操作时,您的程序不会挂起。
答案 3 :(得分:0)
如果您的大多数代码都在互斥锁下运行,那么它将以串行方式运行,而不是以parllel方式运行