免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4507 | 回复: 8

[C++] 问个boost线程池分配任务的问题 [复制链接]

论坛徽章:
0
发表于 2012-09-28 08:54 |显示全部楼层
20可用积分
本帖最后由 2009从-1开始 于 2012-10-03 10:49 编辑

  1. class D
  2. {
  3. };

  4. class A
  5. {
  6.     work( D d);
  7. };

  8. class B
  9. {
  10.     A a;

  11.     // 代码1
  12.     for ( int 1 = 0; i < 100; i++ )
  13.     {
  14.         D d;//d计算得到,有内存的申请释放
  15.         m_threadpool.schedule(boost::bind(&A::work,&a,d));
  16.     }

  17.     // 代码2
  18.     vector<D> vd;
  19.     for( int i = 0; i < 100; i++ )
  20.     {
  21.         D d;//d计算得到,有内存的申请释放
  22.         vd.push_back(d);
  23.     }
  24.     for( int i = 0; i < 100; i++ )
  25.     {
  26.         m_threadpool.schedule(boost::bind(&A::work,&a,vd.at(i)));
  27.     }
  28. }
复制代码
开100个线程,代码1和2不同时执行,测试得到的结论:
1、测试一次时,代码1有性能问题,代码2没有
2、代码2多次执行时(循环),也有性能问题

疑问:
1、多线程开多少个合适?与服务器CPU有什么关系?
2、多线程schedule的开销在哪?

好久没来CU了,有问题就想起大家了^_^

修改了下上面的代码的注释“d根据全局的数据计算得到”,上次描叙的有点小问题

最佳答案

查看完整内容

标准STL对多线程支持很成问题的,代码2似乎存在竞争锁的嫌疑代码1,调试看看,是不是存在多线程下的伪共享问题同一CPU物理运算单元上,同一时间上,只能有一个线程运行的。线程不是越多越好的,线程过多,相互切换都会有很大消耗的

论坛徽章:
0
发表于 2012-09-28 08:54 |显示全部楼层
本帖最后由 围观秀底线 于 2012-09-30 19:38 编辑

标准STL对多线程支持很成问题的,代码2似乎存在竞争锁的嫌疑
代码1,调试看看,是不是存在多线程下的伪共享问题

同一CPU物理运算单元上,同一时间上,只能有一个线程运行的。线程不是越多越好的,线程过多,相互切换都会有很大消耗的

论坛徽章:
0
发表于 2012-09-28 09:02 |显示全部楼层
1. 与cpu关系不太大,开多少线程实际压力模拟测试下,说多少个没意思
2.没啥开销

论坛徽章:
0
发表于 2012-09-28 09:06 |显示全部楼层
先不说子线程的运行耗时,单单分配就有性能问题,这个是测试的结论。
我怀疑是分任务时有分配内存,导致资源竞争?
newyorkumoney 发表于 2012-09-28 09:02
1. 与cpu关系不太大,开多少线程实际压力模拟测试下,说多少个没意思
2.没啥开销

论坛徽章:
0
发表于 2012-09-30 18:49 |显示全部楼层

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2012-09-30 20:20 |显示全部楼层
一般而言(只是“一般而言”),线程数 = CPU数 + 2;(多核CPU算多个CPU)

论坛徽章:
0
发表于 2012-09-30 21:00 |显示全部楼层
本帖最后由 围观秀底线 于 2012-09-30 21:16 编辑
bruceteen 发表于 2012-09-30 20:20
一般而言(只是“一般而言”),线程数 = CPU数 + 2;(多核CPU算多个CPU)


Windows下的高效IO模式IOCP(IO完成端口),默认状况下就是这个

具体开多少线程,没有定语的,还要看具体情况的,例如OS平台特性

论坛徽章:
0
发表于 2012-10-03 10:46 |显示全部楼层
多个线程都需要申请和释放内存操作,这个会导致怎样的竞争?回复 5# 围观秀底线


   

论坛徽章:
0
发表于 2012-10-08 15:49 |显示全部楼层
这个很难有标准答案了,谢谢给意见的同学们
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP