一个困扰我n久的同步问题,大家帮忙啊!!!

clicksoft 2005-01-07 01:19:22
一个网络服务端采用异步IO

流程如下:

服务端有一个死循环采用 select 逐个检查每个套接字(tcp)的可读,可写性
一个套接字对应一个link

服务端在某个套接字上读到数据后转交到该套接字所对应的link来处理

link 从他自己的接收缓冲中分析出一条或多条命令 然后将这些命令挂到一个专门的
命令处理线程处理 该线程处理完后将要回送的数据写到该link的发送缓冲中
等待link 所对应的套接字在服务端死循环中在可写时被发送出去

问题就在 如何处理服务端死循环发送某套接字数据 和 命令处理线程向某套接字发送缓冲写数据 时的同步!!!

假如对每个套接字都用关键段 那么服务端假如有很多的连接的话 可以承受得了吗??

如果用一个关键段老同步所有的操作又显得效率底下了

套接字的发送缓冲为一个队列


在此向大家请教!!!!!
...全文
326 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
CompletionPort 2005-01-31
  • 打赏
  • 举报
回复
追求完美设计的结果。
clicksoft 2005-01-31
  • 打赏
  • 举报
回复
clicksoft 2005-01-24
  • 打赏
  • 举报
回复
clicksoft 2005-01-22
  • 打赏
  • 举报
回复
to flashboy(爱写程序的小绵羊)

照楼主所讲 只要内存够大 几千个 CRITICAL_SECTION 小case 喽
gdy119 2005-01-21
  • 打赏
  • 举报
回复
设计结构就有问题,
clicksoft 2005-01-21
  • 打赏
  • 举报
回复
flashboy 2005-01-21
  • 打赏
  • 举报
回复
明白你的意思了,“每个套接字都用关键段 那么服务端假如有很多的连接的话 可以承受得了吗??”

这个就看你要一台服务器带多少个用户了,不过我看你使用的SELECT模型,估计也不会带太多,应该会少于1000。 另外不知道你的服务器配置是什么?如果有2CPU,1G以上内存,那是绰绰有余啊。 因为我在的2CPU,2G内存上使用完成端口模型,带5000用户都没什么问题,关键是内存要大,资源不算什么。
clicksoft 2005-01-21
  • 打赏
  • 举报
回复
to gdy119(夜风微凉)

那这样的问题该怎样设计流程呢??
clicksoft 2005-01-18
  • 打赏
  • 举报
回复
to hohai(gg) 和 ilovevc(ilovevc)

在pop、push的时侯加个锁就可以了,反正你的缓冲是LINK单独的,


那假如有1000 个缓冲 不就有1000个 锁了吗??

加1000个锁是不是太恐怖拉

如果只用一个锁 那是否效率又显的太低了
hohai 2005-01-12
  • 打赏
  • 举报
回复
是啊,在pop、push的时侯加个锁就可以了,反正你的缓冲是LINK单独的,
ilovevc 2005-01-12
  • 打赏
  • 举报
回复
我的意思是说 服务端死循环发送某套接字数据时
从该套接字对应的link的发送缓冲 queue 中pop一项然后调用 send(sock,data...)
但可能命令处理线程向该套接字的link queue 中 push 一个数据


; 这里你根本无需同步,pop时你要拷贝这个queue的top结点内容到一个服务端循环线程的局部buffer中,然后再发送。如果命令处理线程向该套接字的link queue 中 push 一个数据,也不会影响。
这样,在pop、push的时侯加个锁就可以了。
clicksoft 2005-01-12
  • 打赏
  • 举报
回复
^
temp3000 2005-01-12
  • 打赏
  • 举报
回复
客户大量时,select 模型本身是瓶颈
clicksoft 2005-01-10
  • 打赏
  • 举报
回复
to: wwwllg(wwwllg)
其实问题就是buff很多 如果每个buff都有一个同步变量的话 是否负担太重

而用一个同步变量的话 效率有太低

这样的问题如何解决 在两者间找到一个合适点


或者整个流程设计有问题 那该如何设置异步tcp服务器的处理流程]
请高手指教
UDX协议 2005-01-08
  • 打赏
  • 举报
回复
1.对于同一个sock,你只能保证同一时刻只能有一个线程,处于read或write。
2。对于同一个buff,你需要转发给每个client sock的时候,需要在add sock,或remove sock的时候同步。
3.在轮循转发给每一个sock后,需要同步delete shared buffer.
4.在每次同步的时候,不能阻塞sock 的read ,write事件。如果阻塞时间长于一段时间(10秒左右,经验值)将不能收到网络事件。

clicksoft 2005-01-08
  • 打赏
  • 举报
回复
我的意思是说 服务端死循环发送某套接字数据时
从该套接字对应的link的发送缓冲 queue 中pop一项然后调用 send(sock,data...)

但可能命令处理线程向该套接字的link queue 中 push 一个数据

这里该怎么同步???

谢谢以上诸位好心人
ilovevc 2005-01-07
  • 打赏
  • 举报
回复
一个可能的方法是:
select 检查到套接字(tcp)的可读后,将该socket从select中移去,这样select就不会发现这个socket可写了。然后处理完成后,再将该socket追加到select fdset中。
cryptonym 2005-01-07
  • 打赏
  • 举报
回复
结构设计有问题
tide2355 2005-01-07
  • 打赏
  • 举报
回复
类封装
类内部进行同步保护
sharkhuang 2005-01-07
  • 打赏
  • 举报
回复
互斥量 信号灯都可以同步
加载更多回复(3)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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