当前位置:  技术问答>linux和unix

一个关于errno,多线程和socket(tcp/ip)的问题!

    来源: 互联网  发布时间:2015-05-07

    本文导语:  如果在socket通信中,使用10000个线程来接收数据和发送数据,在每个线程中使用非阻塞IO,这样引发了一个问题,令人困惑! 当在 rc=recv(socket,buf,1024)//每次读取1024个字节,这就是为什么使用非阻塞IO,因          ...

如果在socket通信中,使用10000个线程来接收数据和发送数据,在每个线程中使用非阻塞IO,这样引发了一个问题,令人困惑!
当在
rc=recv(socket,buf,1024)//每次读取1024个字节,这就是为什么使用非阻塞IO,因
                        //为不知道客户端一次会发送多少字节的数据。所以使用
                        //无限循环来从客户端读取数据,直到客户端将所有的数
                        //据发送完毕,关掉连接。

if (rc==-1 && errno==EAGAIN)//如果接收错误,但是错误是EAGAIN,表明仅仅是没
                            //有收到数据
{
  sleep(1);
  continue;
}
else if (rc==-1 && errno!=EAGAIN)//recv出错
{
  break;
}
else if (rc==0 || errno==EAGAIN)//无数据到达
{
  sleep(1);
  continue;
}
else if (rc>0) //有数据到达
{
}
这个时候一个问题就出现了,errno是全局变量,任何函数都有可能修改它,程序不能对整个线程加锁,这样就变成了只能有一个线程在运行,其他9999个线程都因为竞争而不能运行。这时候线程全无用处,怎么能够解决这个问题呢?

|
编译的时候加上_REENTRANT宏
这样errno就变成多线程安全的了,每个线程都有自己的errno.

|
不管思路正确与否,linaxing(牛牛)说的是对的。errno是每个线程一个的。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • errno在文件操作中的问题
  • 关于linux下errno的实现问题
  • errno 问题
  • 函数 errno的问题 ,大侠来下急
  • 关于errno的问题
  • Linux新手提问...errno.h的问题
  • 问个很菜的问题,如何获取错误代码errno
  • execve failed for /etc/X11/X (errno 2)是什么问题?
  • 编译内核过程中, make xconfig出现的找不到文件errno.h的问题
  • errno变量问题
  • fgets()报错问题(errno=4)
  • 怎样才能知道UNIX 下C语言的ERRNO都代表什么意思?到哪里去查,别外怎样在程序中截获这个errno我好做相应的处理。
  • 使用errno要不要加头文件?
  • sendto,总是返回-1,查看errno说是EPERM
  • Linux 动态库 dlopen()失败,errno = 17, File exists
  • 请教高手,linux下使用libusb_submit_transfer,返回-1,errno = 16,如何解决?
  • 如何根据errno得到文件名
  • Connect函数在出现错误时返回-1,并且设置errno为相应的错误码
  • linux 编写内核函数errno
  • kmod:failed to exec/sbin/modprobe -s -k binfmt-0000 ,errno=8
  • connect失败,errno为115.请问怎么解决?
  • 权限够却莫名其妙报strerror(errno)=Permission denied
  • [Solaris/AIX] read()调用失败,errno为ECONNECTIONRESET,请点解一下大致会是一些什么原因?
  • 怎么老是出现sys_errlist[]与errno sys_nerr 类型不同一 回复者必有分
  • 在Linux系统上recv返回错误,通过errno得到的错误消息为"Interrupted system call"
  • kmod: failed to exec /sbin/modprobe -s -k binfmt-4c46, errno = 2 这是什么错误?
  • 解析mysql数据库还原错误:(mysql Error Code: 1005 errno 121)
  • 操作信号量报错errno=28
  • gethostbyaddr函数老是返回为null 但是查看errno又说成功(success) 为什么求助 深夜求帖
  • [网络编程] recv 接收错误,提示errno=84 或 22
  • 哪位给看一下 为什么连接失败 errno=111 connect 调用失败(这是客户端已tcp方式连接)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3