免费注册 查看新帖 |

Chinaunix

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

[C++] 我需要一个程序不停的检测某一个条件,除了不停的循环以外,有其他方法实现吗? [复制链接]

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
11 [报告]
发表于 2014-03-31 17:02 |只看该作者
归根结底都是轮询, 计算机里没有等的地方。

论坛徽章:
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
12 [报告]
发表于 2014-03-31 17:08 |只看该作者
楼主是来卖萌的,楼上都被忽悠了

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
13 [报告]
发表于 2014-03-31 17:45 |只看该作者
本帖最后由 shan_ghost 于 2014-03-31 17:49 编辑

除非事件发生于系统外部(比如如果CU论坛有新贴,则你家的电脑怎么怎么这类),否则极难找到什么必须轮询的案例。


举例来说,网上过来一个包,网卡收到了,它就会触发一个中断;如果可以中断,OS内核就立即执行相关逻辑。

然后,OS里面,先解析包的协议/目标ip/端口,然后就会发送一个消息给绑定在该协议/ip/端口的应用,这个应用就得到“网上有数据到了”的通知。


然后,假设这个应用是一个游戏,它需要“等服务器确认”——显然,它也用不着不停轮询,看服务器有没有消息过来。

它只需在自己的网络通信模块里面,捕获操作系统的“网上有数据到了”通知即可(select只是需要轮询每一个socket链接;但对每个链接,它其实是“等待缓冲区有数据”这个消息,并不是不停扫描检查缓冲区是否有内容)。

然后,网络通信模块分析过来的网络数据包,识别它的类型——比如,如果是“服务器确认”消息,它就通知模块A;如果是“好友消息”,它就通知界面元素B……



通知的方式呢,其实前面已经提到一些了,可以是中断、可以是事件,还可以是回调。

关键是,必须从一开始就搞明白哪些东西是突发的、如何发现/处理这些突发事件——你写成“扫描缓冲区”,它当然就只能轮询了;但你设计成回调,事件发生了,就可以直接调用你的回调函数

实际上,一般是为一大类事件设计一个事件处理中心(dispatcher),由处理中心为事件分门别类并发送通知;而回调函数则根据关注的事件注册到不同的事件处理中心。

——其实,就连CPU中断也可以看做这个处理模式:中断发生,则置标志位(相当于发送事件通知);CPU发现中断置位(可认为是硬件每时钟周期“轮询”有无中断发生),就切换去执行相应中断服务程序(相当于根据中断号调用相应回调函数,即按中断号本身来dispatch)。
——除了CPU硬件检查中断标志位这个动作,或者如前面提到的CU有新贴之类没有提供API的外界变动(显然,如果CU在有新贴时能通过http长链接发一个消息,那么也可以做到事件触发),计算机内部可能没有什么是不能转变成事件-通知-回调模式的。

论坛徽章:
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
14 [报告]
发表于 2014-03-31 20:29 |只看该作者
fender0107401 发表于 2014-03-31 10:23

条件变量.
pthred_cond_t;

论坛徽章:
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
15 [报告]
发表于 2014-03-31 22:27 |只看该作者
  1. set
  2. get
  3. std::vector<callback>
复制代码

论坛徽章:
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-03-31 22:58 |只看该作者
在主线程里wait CV,起个线程检查条件然后notify CV

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
17 [报告]
发表于 2014-04-01 01:12 |只看该作者
事件驱动模型
    C下面的:libevent
    python下面的: twisted

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
18 [报告]
发表于 2014-04-01 08:16 |只看该作者
感谢各位兄弟帮忙。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
19 [报告]
发表于 2014-04-02 10:33 |只看该作者
轮训效率太低,无谓的消耗系统资源, 用条件变量比较好, 条件出发时内核会自动**等待的线程。

论坛徽章:
0
20 [报告]
发表于 2014-04-02 22:04 |只看该作者
本帖最后由 zzhiyuan 于 2014-04-03 19:23 编辑

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP