社区
网络编程
帖子详情
请问accept+多线程跟用select的区别?
becgiggs
2009-06-01 01:01:02
主服务线程accept,每监听到一个新的连接,就为他创建一个子服务线程,在子服务线程里recv()、send该连接有关的数据。
或者只有一个select线程,同时查看多个fd。有连接就recv/send
这两种做法有啥区别啊?
...全文
857
25
打赏
收藏
请问accept+多线程跟用select的区别?
主服务线程accept,每监听到一个新的连接,就为他创建一个子服务线程,在子服务线程里recv()、send该连接有关的数据。 或者只有一个select线程,同时查看多个fd。有连接就recv/send 这两种做法有啥区别啊?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wz19870212
2009-08-04
打赏
举报
回复
补充两者我在单核.一次查询数据库一万条数据时做的测试..select 需要15秒左右返回 ...多线程在11秒左右返回.测试n次..改进多线程为缓冲队列.4秒返回..
wz19870212
2009-08-04
打赏
举报
回复
select 模型适合处理事务级别的或是数据量不大的..如果数据量大的话效率速度明显不如多线程的
多线程对数据量的大的比较适合...
这样够通俗了把
cadhy
2009-08-04
打赏
举报
回复
mark
hdqqq
2009-06-08
打赏
举报
回复
第一种适合小客户量的情况,第二种用一个线程处理收发, 但是select的socket数量是有限的.理想的情况是 iocp + 线程池.
huliang66
2009-06-08
打赏
举报
回复
学习
tianyou8
2009-06-08
打赏
举报
回复
第一种方式,是一种per-client-per-Thread方式,实现简单,结构清晰,但是客户端多了后,系统开销大,故只适合很小规模的系统\
第二种方式,采用的集合的方式来管理socket,可以同时等待几个连接,效率比较高,并且允许的客户端数量也较多,个人觉得实现起来并不复杂,网上,书上资料较多,也是不错的一种选择
yangangs
2009-06-02
打赏
举报
回复
楼上正解
mfc168
2009-06-02
打赏
举报
回复
如果只有10个连接,二者的效率区别几乎可以忽略
最大的区别是实现方式不同
第一种方式相当于accept后,由专门的线程来处理,思路清晰,容易控制,如果对于10个连接的处理方式相同,建议采用这种处理,只写一个客户工作线程,启动多次而已,如果不同的用户,处理方式不同,不要采用这种方法
第二种方式 是先fd_set,将多个fd同时select 当有消息时,需要判断每个fd, FD_ISSET返回TRUE,然后进行accept,recv等操作,不同的fd处理方式不同,应该采用此方式
recv没有太大区别,只是在服务器send的时候,派发需要较好的控制
个人认为第一种方式思路更清晰更好控制
becgiggs
2009-06-01
打赏
举报
回复
我当然知道一个cpu同时,只能处理一个线程,但我的意思说是,当线程a在处理 i/o这种不浪费cpu资源的操作时,线程b可以利用一下cpu。这样岂不比一个select线程死等recv高。
楼上有人说的“这个时候socket是异步的,不需要等recv完成,这个等待可能是由你的网络层去完成,而不是你的CPU ”,比如,recv的数据到一个数组里,然后,要处理这个数组。recv不完成,我咋知道这个数组里面的数据能不能用?
另外,我一开始就说了,线程比较少,因此,不要老揪着iocp不放,我也知道线程切换浪费时间
newborn2012
2009-06-01
打赏
举报
回复
注意:select也有fd个数的限制的,可不是无限的。
windbger
2009-06-01
打赏
举报
回复
更准确点,是一个processor在一个时刻只能执行一个线程,多核的计算机当时可以同时执行多个线程。
select模型可以一个线程处理多个socket,效果比每个socket对应一个线程要高。
线程太多时,光在这些线程进行切换就耗费很多CPU时间片,所以IOCP效率高,使用线程池的缘故。
Conry
2009-06-01
打赏
举报
回复
[Quote=引用 11 楼 yhlovehx 的回复:]
首先你要明白这个问题。
你的机器 同时能够处理的也就一个线程
你开再多的线程 同一时刻也就一个线程在运行。。。
你对多线程编程的认识有误区
[/Quote]
多核或者多cpu就不是你说的这样了
yhlovehx
2009-06-01
打赏
举报
回复
首先你要明白这个问题。
你的机器 同时能够处理的也就一个线程
你开再多的线程 同一时刻也就一个线程在运行。。。
你对多线程编程的认识有误区
YaYiYaO
2009-06-01
打赏
举报
回复
[Quote=引用 7 楼 becgiggs 的回复:]
不明白为啥select的效率高了?因为select中多个socket的处理在一个线程里,第二个的处理,还要等第一个recv完之后才行。
而为每个连接创建一个线程,这个在recv等待i/o的时候,另一个线程就可以开始自己用cpu了。
当然,我指得是线程数量少的情况下
[/Quote]
这个时候socket是异步的,不需要等recv完成,这个等待可能是由你的网络层去完成,而不是你的CPU
具体可能要去查看select模式的实现了
dch4890164
2009-06-01
打赏
举报
回复
第二种比较强大,除了你说的select还可以处理很多事情,比如你说的i/o问题,有些时候像发送文件,还非这样用不可
具体的可以看一下 unix网络编程关于select的描述,楼主就会明白了
或者反汇编一下飞鸽传书成win32 asm,基本上你就明白为什么不得不用了
wzw200
2009-06-01
打赏
举报
回复
是不是 进程和线程的区别
becgiggs
2009-06-01
打赏
举报
回复
不明白为啥select的效率高了?因为select中多个socket的处理在一个线程里,第二个的处理,还要等第一个recv完之后才行。
而为每个连接创建一个线程,这个在recv等待i/o的时候,另一个线程就可以开始自己用cpu了。
当然,我指得是线程数量少的情况下
YaYiYaO
2009-06-01
打赏
举报
回复
看你客户端的量,如果只有几个或者10几个链接数的话,当然可以用第一种方法,因为这个简单
但是如果有几百甚至几千的链接数的话,你不可能开几千个线程啊,这样不现实也严重影响性能
所以处理大并发量的话,选择用select或者用iocp
becgiggs
2009-06-01
打赏
举报
回复
有人给回答一下吗上面那个问题吗?
becgiggs
2009-06-01
打赏
举报
回复
我需要处理的连接数很少,小于10个。是不是可以理解为,连接数多的时候select效率高。连接数少的时候,为每个连接分别创建一个子服务线程效率高。因为线程的维护也要考虑效率。但其实,recv/send相当于I/O的,所以,能并发尽量并发?只是因为windows线程的限制吗?
加载更多回复(3)
本项目包括利用
多线程
、
select
、poll以及epoll实现的并发处理连接请求
服务器与客户端建立连接需要使用到一些接口,包括但不限于socket、bind、listen、
accept
.高并发编程会有一些服务器模型,例如reactor或proactor。这两类都要使用到IO多路复用,O多路复用是指单个进程/线程就可以同时处理多个IO请求。有三个方式
select
、poll、epoll。
select
:将文件描述符放入一个集合中,调用
select
时,将这个集合从用户空间拷贝到内核空间(缺点:每次都要复制,开销大),由内核根据就绪状态修改该集合的内容。 poll:和
select
几乎没有
区别
,
区别
在于文件描述符的存储方式不同,poll采用链表的方式存储,没有最大存储数量的限制; epollepoll底层通过红黑树来描述,并维护一个ready list,将事件表中已经就绪的事件添加到这里,在使用epoll_wait调用时,仅观察这个list中有没有数据即可。
TCP一对多通信_基于MFC
多线程
(VS2010版)
我用MFC VS2010编写的一个 TCP 一对多通信的程序,就是服务器端利用
多线程
技术(不使用
Select
等任何模型), 能同时接收多个客户端的消息, 其次, 服务器端还能将消息群发给所有已连接的客户端, 实现的基本思路 是将每个线程中
accept
函数返回的套接字 都保存到一个套接字数组中,套接字地址也保存到一个数组中。然后在“群发”的 按钮消息中,用for循环 遍历套接字数组中的每个套接字,对每个套接字都使用send函数发送消息。
windows网络编程之tcp/ip
课程内容: c/s模型的编码,5种windows网络模型:
select
,异步选择,事件选择,重叠io,完成端口,以及基础理论知识的讲解。 课程分八章,总课时100课时左右,每日更新2~5节. 课程代码会带大家一行一行书写,保证...
select
模型的源程序,不适用
多线程
检测客户端关闭
server端用
select
模型来解决
accept
和recv的阻塞问题,不适用
多线程
简单
多线程
socket聊天室程序(c语言)
server.c client.c Makefile 在linux下编译通过,C语言编写,短小精练。 server实现数据转发,使用了socket中的
accept
,
select
,线程中的线程分离属性(PTHREAD_CREATE_DETACHED)等 client实现读和写的异步,也使用了线程分离属性。 直接实现多个client终端对话。 可做为新人学习的参考。
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章