免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5085 | 回复: 8
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 2012-09-28 08:54 |只看该作者
本帖最后由 围观秀底线 于 2012-09-30 19:38 编辑

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

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

论坛徽章:
0
3 [报告]
发表于 2012-09-28 09:02 |只看该作者
1. 与cpu关系不太大,开多少线程实际压力模拟测试下,说多少个没意思
2.没啥开销

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

论坛徽章:
0
5 [报告]
发表于 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
6 [报告]
发表于 2012-09-30 20:20 |只看该作者
一般而言(只是“一般而言”),线程数 = CPU数 + 2;(多核CPU算多个CPU)

论坛徽章:
0
7 [报告]
发表于 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
8 [报告]
发表于 2012-10-03 10:46 |只看该作者
多个线程都需要申请和释放内存操作,这个会导致怎样的竞争?回复 5# 围观秀底线


   

论坛徽章:
0
9 [报告]
发表于 2012-10-08 15:49 |只看该作者
这个很难有标准答案了,谢谢给意见的同学们
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP