惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
V
Visual Studio Blog
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
L
LangChain Blog
Martin Fowler
Martin Fowler
GbyAI
GbyAI
博客园 - 司徒正美

博客园 - cpunion

使用dpkt和pcap抓包 [收藏] jfwan实现的一个C++委托类 [c++] c++0x中的auto和typeof ACE_SOCK_Stream send和recv超时设置 哀悼18位在车祸中死去的人 对ACE_TP_Reactor定时器处理机制做一点修改。 C++编写“异步调用代理组件”的一点想法 有趣的东西:Test () () () () () () () () () (); - cpunion VC2005 Beta 2 模板偏特化有些问题 [python] and or 表达式陷阱一则。 Media Player Classic外挂字幕时间调整脚本 我们的标准化委员会网站在哪? 不就是个座嘛 answers.com真是个不错的网站 《星际之门》和《亚特兰蒂斯》总算是更新了 生成gb2312码表 - cpunion - 博客园 [假如设计一个新语言] 哪些语言特性是我想要的 写一个CopyOnWrite的通用实现(C++) - cpunion - 博客园 Python写的一个适配器类。
ACE_TP_Reactor的限制
cpunion · 2005-08-30 · via 博客园 - cpunion

仔细研究了一下,如果要使用ACE_TP_Reactor,则不宜对同一个ACE_Event_Handler同时注册SOCKET和其它事件,因为ACE_TP_Reactor只保证“不会有2个线程同时调用同一个Event_Handler的SOCKET事件处理器”。

上次我修改了一个版本,让它能同时处理SOCKET事件和TIMER事件,不过在压力测试下还是出了问题。原因是当客户端主动断线时,peer().get_handler()将返回一个无效值,这时正在处理handle_close但还没有完成,另一线程却获取了TIMER事件,原有的判断无法处理这种SOCKET句柄失效情况,所以handle_timeout被调用,而另一调用handle_close的线程这时可能正好把对象析构掉了,造成段错误。更隐蔽的情况,是对象被析构了,事件分派程序却在调用它的get_handler方法,出现机率小,但却致命,所以那个做法是有很大问题的。

唯一的解决是把原来的suspend_*和resume_*处理SOCKET句柄改为处理ACE_Event_Handler*,这将保证“不会有2个线程同时调用同一个Event_Handler的处理方法”,不过修改太多,而且我现在觉得使用反应器线程池在很多场合不太适合。想一想这种情况:服务器要定时向客户端发送探测消息,假如刚要调用发送时,处理器被另一线程析构了(可能是客户端断线引起的),就会有一个段错误。加一把“大锁”?还不如做单线程。

大概没有更好的理由一定要使用ACE_TP_Reactor,好点的做法是使用单线程的Reactor,把收到的“消息”放入一个同步队列,由一个线程池去处理,处理的结果(要发送的消息)放入别一同步队列,使用某种激发机制(信号,定时器,通知)使Reactor调用处理器去发送。如果要发送定时探测,可以直接从Reactor启动一个定时器,由于是单线程的,不需要处理那么些麻烦事。

上次见有人说,单线程的Reactor 可能在处理SOCKET时阻塞,影响所有客户响应,我测试时并没有遇到这种情况,可能是我设置了NON_BLOCKING的缘故。