我的epoll + 多线程这样的处理有问题吗??

tietiehe 2015-11-30 04:36:24
一个epoll的fd,多个线程共用的epoll的fd,注册的事件是:EPOLLIN | EPOLLET | EPOLLOUT | EPOLLRDHUP | EPOLLERR | EPOLLHUP ,使用的是centos 5.5 的32位系统
现在我的问题是,有时候epoll_wait会触发多个socket的读事件,是这样的:线程1接收到socket1的read事件,进行读处理,读的过程中,线程2又收到socket1的read事件,然后这种就发生了错误。
请问下,一个socket,没有读完的情况下会接受到多个读事件吗,这种情况是正常的吗
以下是简化的代码

//svr就是线程的回调
int CEpollLoop::svr()
{
socklen_t socklen;
socklen = sizeof(struct sockaddr);
int nEventsNum = 0;
struct epoll_event events[MAX_EPOLL_EVENT];

while(!m_flag)
{
nEventsNum = epoll_wait(m_epollFd, events, MAX_EPOLL_EVENT, -1);
if (nEventsNum > 0)
{
for (int nIndex = 0; nIndex < nEventsNum; ++nIndex)
{
sEpollEventPtr * se = (sEpollEventPtr *)events[nIndex].data.ptr;

if(se->se && m_accFD == se->se->GetSock())
{
for(;;)
{
struct sockaddr_in addrClient;
int nSocketClient = accept(m_accFD, (struct sockaddr *)&addrClient, &socklen);
if(nSocketClient == -1)
{
break;
}

//这个里面会注册事件EPOLLIN | EPOLLET | EPOLLOUT | EPOLLRDHUP | EPOLLERR | EPOLLHUP
RigisterEvent();
}
}
else if((events[nIndex].events & EPOLLRDHUP) || (events[nIndex].events & EPOLLERR) || (events[nIndex].events & EPOLLHUP))
{
error();
}
else if(events[nIndex].events & EPOLLIN)
{
read();
}
else if(events[nIndex].events & EPOLLOUT)
{
send();
}
}
}

usleep(1);
}// end while

return eNetSuccess;
}
...全文
103 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 版主 2015-12-01
  • 打赏
  • 举报
回复
这样处理肯定有问题的,除非把多个线程收到的同一个socket的数据编号,排序,然后按序放入队列——从socket收到的是数据流,数据流一但处理断掉,有可能会引发数据解析错误的问题(一个完整的应用层协议包被两个线程分别不同处理)
橘风之轮 2015-12-01
  • 打赏
  • 举报
回复
为啥一个套接字要两个线程都能操作呢?
tietiehe 2015-12-01
  • 打赏
  • 举报
回复
自顶一次
Huppert 2015-12-01
  • 打赏
  • 举报
回复
但是线程1读完数据后,socket可能收到新的读信号 线程1读完数据指的是 read返回 readAgain错误,或返回的字节数小于你要读取的字节数。
Huppert 2015-12-01
  • 打赏
  • 举报
回复
设置了边缘触发,一个线程read完以前不会收到新的读信号

64,282

社区成员

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

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