关于epoll的疑问
有经验的告诉下
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,貌似么这个事件啊,这个时间是什么意思