免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lost_templar
打印 上一主题 下一主题

[C++] 谁来来帮我看看这个简单的线程池(c++11) [复制链接]

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
11 [报告]
发表于 2014-04-30 15:48 |只看该作者
回复 10# lost_templar

simple_thread_pool在析构的时候会先析构joiner, 然后才是自己, 也就是all_done_flag = true, 想明白了没
~simple_thread_pool()
{
    all_done_flag = true;
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2014-04-30 15:56 |只看该作者
gaojl0728 发表于 2014-04-30 15:48
回复 10# lost_templar

simple_thread_pool在析构的时候会先析构joiner, 然后才是自己, 也就是all_don ...

测试显示不是这样的
  1. cat m.cc && g++-4.9 -o m m.cc && ./m
  2. #include <iostream>

  3. struct s
  4. {
  5.     ~s()
  6.     {
  7.         std::cout << "~s\n";
  8.     }
  9. };

  10. struct t
  11. {
  12.     s s_;
  13.     ~t()
  14.     {
  15.         std::cout << "~t\n";
  16.     }
  17. };

  18. int main()
  19. {
  20.     t t_;
  21.     return 0;
  22. }
  23. ~t
  24. ~s
复制代码

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
13 [报告]
发表于 2014-04-30 16:00 |只看该作者
本帖最后由 gaojl0728 于 2014-04-30 16:00 编辑

回复 12# lost_templar

对, 是我想错了, 析构是反顺序的, 我想错了。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
14 [报告]
发表于 2014-04-30 16:01 |只看该作者
整体上写的挺好!

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
15 [报告]
发表于 2014-04-30 16:05 |只看该作者
回复 12# lost_templar


那这样为什么还会有你说的那个问题?你打印下确定the_thread.joinable()返回的是true吗?
if ( the_thread.joinable() )
    the_thread.join();

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
16 [报告]
发表于 2014-04-30 16:13 |只看该作者
回复 8# gaojl0728

Yield的那个忙循环时是拿了锁的啊,新任务怎么放得进去?

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
17 [报告]
发表于 2014-04-30 16:16 |只看该作者
回复 16# windoze


    外面有个大括号啊, 执行完了会释放锁

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
18 [报告]
发表于 2014-04-30 16:35 |只看该作者
回复 16# windoze


    我这样修改了也不成的:
  1.         void work_loader()
  2.         {
  3.             while ( ! all_done_flag )
  4.             {
  5.             /*
  6.                 function_type current_work;
  7.                 {
  8.                     std::lock_guard<std::mutex> lg{ work_queue_mutex };
  9.                     if ( work_queue.empty() )
  10.                     {
  11.                         current_work = [](){ std::this_thread::yield(); };
  12.                     }
  13.                     else
  14.                     {
  15.                         current_work = work_queue.front();
  16.                         work_queue.pop();
  17.                         ++job_executed;
  18.                     }
  19.                 }
  20.                 current_work();
  21.             */

  22.                 function_type current_work = nullptr;

  23.                 {
  24.                     std::lock_guard<std::mutex> lg{ work_queue_mutex };
  25.                     if ( !work_queue.empty() )
  26.                     {
  27.                         current_work = work_queue.front();
  28.                         work_queue.pop();
  29.                         ++job_executed;
  30.                     }
  31.                 }

  32.                 if ( !current_work )
  33.                     current_work = [](){ std::this_thread::yield(); };

  34.                 current_work();
  35.             }
  36.         }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
19 [报告]
发表于 2014-04-30 16:36 |只看该作者
回复 15# gaojl0728


    这个地方木有问题,我确认过

    等等我把全部代码贴一下,不过非常长~~

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2014-04-30 16:39 |只看该作者
回复 19# lost_templar


    将近6万行,还是算了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP