当前位置: 技术问答>linux和unix
socket编程中的select问题
来源: 互联网 发布时间:2014-11-21
本文导语: 诸位老大: 在下是个新手,在开发中遇到如下问题,请指教: 我在用Socket做一个双向平台,即对上是个Client端,对下是个Svr端, 我原来的设计是为每个Socket创建一个线程,然后在其中用recv做阻塞循环即 while(true...
诸位老大:
在下是个新手,在开发中遇到如下问题,请指教:
我在用Socket做一个双向平台,即对上是个Client端,对下是个Svr端,
我原来的设计是为每个Socket创建一个线程,然后在其中用recv做阻塞循环即
while(true)
{
...
if( recv(m_ClntSock...) > 0)
{
数据处理
}
...
}
后来有位老大建议我用Select编程以节省资源,但我遇到以下问题:我的Sock处理线程在select的同时,其它线程有可能删除或创建新的Sock,即需要修改Sock描述符集,
请问:
1.这个修改对于Sock处理线程是否无效?比如说我的其他线程在这组Sock描述符集中增加了一个新socket,当这个socket有数据时Sock处理线程的select能否触发?
2.如果我仍为每个Socket创建一个线程,但用select来做触发(仅监测一个socket)后再
调用recv接收,能否减小cpu 占用?
3.有其他更好的办法吗?
在下是个新手,在开发中遇到如下问题,请指教:
我在用Socket做一个双向平台,即对上是个Client端,对下是个Svr端,
我原来的设计是为每个Socket创建一个线程,然后在其中用recv做阻塞循环即
while(true)
{
...
if( recv(m_ClntSock...) > 0)
{
数据处理
}
...
}
后来有位老大建议我用Select编程以节省资源,但我遇到以下问题:我的Sock处理线程在select的同时,其它线程有可能删除或创建新的Sock,即需要修改Sock描述符集,
请问:
1.这个修改对于Sock处理线程是否无效?比如说我的其他线程在这组Sock描述符集中增加了一个新socket,当这个socket有数据时Sock处理线程的select能否触发?
2.如果我仍为每个Socket创建一个线程,但用select来做触发(仅监测一个socket)后再
调用recv接收,能否减小cpu 占用?
3.有其他更好的办法吗?
|
1:
会触发,因为线程都是共享数据的,但是要重新调用select。
2:
要看你实际通讯的情况了,如果每一个通讯的时间相对较少的话,可以这样做啊。
3:
要看你实际通讯的模式和情况了。
比如说客户端的连接时间,通讯量等等了。
最好看看电力出版社的《高级TCP/IP编程》
会触发,因为线程都是共享数据的,但是要重新调用select。
2:
要看你实际通讯的情况了,如果每一个通讯的时间相对较少的话,可以这样做啊。
3:
要看你实际通讯的模式和情况了。
比如说客户端的连接时间,通讯量等等了。
最好看看电力出版社的《高级TCP/IP编程》