免费注册 查看新帖 |

Chinaunix

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

[C++] 阻塞与非阻塞哪个更耗cpu资源? [复制链接]

论坛徽章:
0
发表于 2017-08-04 09:45 |显示全部楼层
本帖最后由 qfmeal 于 2017-08-04 09:50 编辑

公司项目代码中有一个事件循环:    MSG msg;
    while (true)
    {
        if (GetMessage(&msg))
        {
            if (msg.uMsg == WM_QUIT)
                break;

            DispatchMessage(&msg);
        }

        usleep(1000);
    }


看到这个代码,我在想在写socket的时候,经常会使用阻塞的方式或者非阻塞的方式读写。
那么那种方式更耗cpu资源呢?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2017-08-04 10:23 |显示全部楼层
一样啊,
OS内部都·non-block的, block的是从利用non-block函数包装来的。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2017-08-04 13:11 |显示全部楼层
block会陷入内核出让cpu,non-block可以让你立刻返回处理其他是为了更充分地利用cpu

这两者哪个更消耗cpu没有可比性,所以你的问题没有意义。
你该考虑的是这两者各自的编程模型和适应的场景

论坛徽章:
137
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5719周年集字徽章-庆
日期:2019-08-27 13:28:5615-16赛季CBA联赛之福建
日期:2019-09-10 11:43:2519周年集字徽章-周
日期:2019-12-12 10:54:07
发表于 2017-08-04 13:55 |显示全部楼层
usleep有什么区别,代码看得不少,反倒麻木没具体概念了

论坛徽章:
0
发表于 2017-08-04 13:58 |显示全部楼层
usleep感觉多余

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2017-08-04 16:04 |显示全部楼层

没有usleep,CPU消耗将达到100%。而且是无谓消耗。

论坛徽章:
0
发表于 2017-08-04 16:07 |显示全部楼层
回复 6# yulihua49

GetMessage应该要设计成阻塞函数

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2017-08-04 17:39 |显示全部楼层
1楼和5楼头像一样,哪个是马甲

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2017-08-04 20:02 |显示全部楼层
xujunxp 发表于 2017-08-04 16:07
回复 6# yulihua49

GetMessage应该要设计成阻塞函数

是的。这种轮询不是好办法。
看看我的贴:

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2017-08-04 20:04 |显示全部楼层
本帖最后由 yulihua49 于 2017-08-04 20:15 编辑
xujunxp 发表于 2017-08-04 16:07
回复 6# yulihua49

GetMessage应该要设计成阻塞函数

轮询总是不好的。
http://bbs.chinaunix.net/thread-4252407-1-1.html
采用事件触发是最好的。阻塞就是1:1事件。
如果同时有多个事件需要处理就采用M:1。M个事件由1个线程处理,用select。
如果需要多个线程同时处理多个事件就采用M:N。M个事件由N个线程处理,用epoll。
就是说,楼主需要用什么方式处理socket,按上述选择。楼主学习下select和epoll相关知识。再学下C10K相关知识。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

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

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

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP