当前位置: 技术问答>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个线程都因为竞争而不能运行。这时候线程全无用处,怎么能够解决这个问题呢?
当在
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.
这样errno就变成多线程安全的了,每个线程都有自己的errno.
|
不管思路正确与否,linaxing(牛牛)说的是对的。errno是每个线程一个的。