如果多个线程同时select同一个套接字会怎么样?可以这样吗?

wd_6532 2005-02-18 04:52:07
两个cpu

两个线程并行执行select,等待相同的100个socket,可以吗,会有什么问题?
...全文
469 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
我不懂电脑 2005-02-24
  • 打赏
  • 举报
回复
只要互斥处理好了,应该没什么问题。
tengulre 2005-02-23
  • 打赏
  • 举报
回复
同意楼上.
gaoxianfeng 2005-02-23
  • 打赏
  • 举报
回复
领导说要多个线程recv,send.不可违
??

一般是多个线程处理多组不同的 fd
然后把数据线程内预处理
需要交互的再集中处理
wd_6532 2005-02-21
  • 打赏
  • 举报
回复
to zeusnchen:
我不是用阻塞方式.
我用的poll或者select的非阻塞模型,有数据才会调用recv函数,没有数据就在poll或者select函数上等待
zeusnchen 2005-02-21
  • 打赏
  • 举报
回复
sorry,偶以为你用的阻塞方式
那样的话,也会有问题三
你没法控制哪个thread收哪些数据了
当然要看你的目的了
呵呵
zeusnchen 2005-02-20
  • 打赏
  • 举报
回复
》我觉得只要不是几十个cpu,单个线程poll之后recv 和 多个线程poll recv是一样的,
》因为recv不会阻塞,仅仅是一个内存拷贝。
当然会阻塞,你第一次recv后就把接收缓冲里的东西可能收完了
下次再recv就要阻塞了
wd_6532 2005-02-20
  • 打赏
  • 举报
回复
领导说要多个线程recv,send.不可违。
我觉得只要不是几十个cpu,单个线程poll之后recv 和 多个线程poll recv是一样的,
因为recv不会阻塞,仅仅是一个内存拷贝。

看来只好用两个线程分别处理不同的socket组了。
至于send,就同步一下,每次send前,先锁一下这个socket对应的互斥锁。
ringerxyz 2005-02-19
  • 打赏
  • 举报
回复
楼上说的有道理,还有select可以在100个socket上执行吗?好像有最大限制的
zeusnchen 2005-02-18
  • 打赏
  • 举报
回复
只要socket的事件没有消失,select就会成功,所以你的各个线程要处理这个race condition
例如,socket a 有read事件,线程1select返回后,在调用处理这个read事件前,线程2可能
也会在a上select,它同样会得到read事件,如果它也去处理,就产生了race condition,
先处理read事件的线程pass,后面一个可能就会组塞了
不明白你为什么用多个线程去select同一堆socket?
或许应该让不同的线程负责不同的sockets,避免这种race condition?
tukey 2005-02-18
  • 打赏
  • 举报
回复
up

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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