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

推荐订阅源

Vercel News
Vercel News
Recorded Future
Recorded Future
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Google DeepMind News
Google DeepMind News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Microsoft Azure Blog
Microsoft Azure Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
N
News | PayPal Newsroom
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Help Net Security
Help Net Security
博客园 - Franky
SecWiki News
SecWiki News
Recent Announcements
Recent Announcements
T
Troy Hunt's Blog
The Register - Security
The Register - Security
The Last Watchdog
The Last Watchdog
Webroot Blog
Webroot Blog
S
Security Affairs
博客园 - 司徒正美
S
Schneier on Security
I
InfoQ
博客园_首页
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Threat Research - Cisco Blogs
Forbes - Security
Forbes - Security
腾讯CDC
N
Netflix TechBlog - Medium
N
News and Events Feed by Topic
Cloudbric
Cloudbric
T
The Exploit Database - CXSecurity.com
P
Proofpoint News Feed
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta
Recent Commits to openclaw:main
Recent Commits to openclaw:main
B
Blog
V
Vulnerabilities – Threatpost
C
Check Point Blog
Google DeepMind News
Google DeepMind News
Google Online Security Blog
Google Online Security Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
Cisco Blogs
Schneier on Security
Schneier on Security
O
OpenAI News
K
Kaspersky official blog

博客园 - 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的缘故。