【请教】为什么我用多线程反而速度变慢了

jxdz232601 2016-07-06 05:06:48
要实现功能:读取24个文件里面的内容,存入一个hash表中。(每个文件60多M,hash表里面10万个节点)
一开始使用单线程方式,实现功能用了3秒。
后来我用多线程模式,创建了24个线程,存入的代码用了互斥锁,最后用了pthread_join()等待24个线程结束,结果实现功能用了9秒!!!!


我的电脑的CPU是多核的,理论上应该速度至少快1倍才对吧。
...全文
3211 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2016-07-07
  • 打赏
  • 举报
回复
这里,如果是界面程序的话,多线程也许不能提高读写效率 但是可以解决界面刷新等待的问题 如果是单线程,界面就会一直在等待读写数据,和哈希表 界面刷新就停掉了,这样用户体验不好。 你这个场景确实不适合多线程。
jxdz232601 2016-07-06
  • 打赏
  • 举报
回复
楼上几位,谢谢了, 我自己测试了一下,时间主要还是消耗在互斥锁上面了,在我的这个场景下,线程越多,速度越慢,即便是只有2个线程,也比单线程慢。至于磁盘读写,倒是没测试。
pengzhixi 2016-07-06
  • 打赏
  • 举报
回复
你这个场景使用多线程是否真的会有提高呢?第一 先说读文件,开24个线程读文件并不能提高 很可能取得反效果,先不说线程切换消耗的时间,单线程切换读不同的文件的时候导致磁盘的磁头需要重新定位消耗的时间就不小,再说你那个写hash表,因为你用的互斥锁,这意味着线程越多,竞争就越大(假设你每个线程参与了写hash表)锁竞争消耗的时间又是一笔不小的开销。所以很多时候效率和线程数并不是有一个正比的关系。
jxdz232601 2016-07-06
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
问题是,写文件的速度,跟多线程没关系。因为即便是多硬盘,还是不能多线程写 哈希表更跟多线程,没关系。 有两个线程,基本上就可以了 最多开四个 除非你的程序在服务器上跑
跟多线程无关的话,至少应该是差不多快,而不会慢3倍吧, 不过我也觉得是线程太多的原因,线程抢有限的CPU也会消耗时间。
七擒关羽 2016-07-06
  • 打赏
  • 举报
回复
开多线程,同步处理没做好,效率会明显降低
jiqiang01234 2016-07-06
  • 打赏
  • 举报
回复
io是瓶颈,读写硬盘多线程反而会损失效率
lm_whales 2016-07-06
  • 打赏
  • 举报
回复
问题是,写文件的速度,跟多线程没关系。因为即便是多硬盘,还是不能多线程写 哈希表更跟多线程,没关系。 有两个线程,基本上就可以了 最多开四个 除非你的程序在服务器上跑
jxdz232601 2016-07-06
  • 打赏
  • 举报
回复
用多线程处理肯定比单线程要快,那我该如何优化我的多线程?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧