关于epoll的疑问

malone1 2014-07-03 11:35:18
有经验的告诉下
1.
vector<Fduct> signalfd;
bool baccept = true;
if(1 !=shmtx_trylock(m_pmtx)){//多进程抢锁,没抢到就只处理已经连接上来的客户端的事件
baccept = false;
m_Reator.Run(signalfd);
}
else{
m_Reator.AddEvent(m_listen,READABLE);//抢到锁监听fd的事件也处理
m_Reator.Run(signalfd);
m_Reator.DelEvent(m_listen,READABLE);
}

if(baccept){
int ret = shmtx_unlock(m_pmtx);//处理完释放进程同步锁
}

map<int,BaseEvent *>::iterator iter;
for(size_t i =0;i<signalfd.size();i++)
{
iter = m_clientmap.find(signalfd[i].fd);
if(iter != m_clientmap.end()){
BaseEvent * p = iter->second;
if(p){
if(signalfd[i].mask & READABLE)
p->OnRead();
else if(signalfd[i].mask & WRITABLE)
p->OnSend();
}
}
else
{
printf("not find fd :%d",signalfd[i].fd);
}

}
//解锁移动到这就没有惊群的问题
if(baccept){
int ret = shmtx_unlock(m_pmtx);//处理完释放进程同步锁
}
return 0;


通过进程同步锁,同一时间只有一个epoll在处理listen fd,epoll处理完成之后释放锁.感觉么什么问题,但是还是会出现accept errno=11,就是已经处理过的意思,也就是所谓的惊群,不知道什么原因.

2.
if (events[i].events & EPOLLIN){
还有events[i].events有时候会出现256,貌似么这个事件啊,这个时间是什么意思
...全文
105 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧