多线程通信服务器的实现

deanjiang 2002-04-24 04:10:35
我再做一个服务器,TCP协议,异步Socket.
由于每个线程只能支持64个Socket,我必须实现多线程。由于一个服务器端的任务可能会有多个Socket,无法保证这些Socket在同一个线程中,因而会有同步问题。

比较麻烦的是,一个任务可能会删除、暂停其他任务,任务也可能删除自身使用的其他的Socket,而其他的任务或Socket可能会同时执行因而会出现死锁。
比如任务A从客户1接收数据,放入缓冲区,任务B从缓冲区中取数据,传给客户2。如哦任何一个客户崩溃了,AB两个任务都要中止。如果两个客户同时崩溃,并且AB从不同的线程执行,AB都要尝试删除对方,因为AB都已经被锁定,所以会一直等待下去。

那位能帮我想一个好点的模型,避免这种情况出现。
肯定不可以锁定所有的任务,效率太低。

谢谢
...全文
45 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
deanjiang 2002-04-27
  • 打赏
  • 举报
回复
能说具体点吗?或者我们可以再QQ上讨论一下
我的QQ好发到你的留言板中了
zbill 2002-04-27
  • 打赏
  • 举报
回复
按照你所说的情况,如果我做的话,我会把事务和业务分开处理!按照你目前的做法,业务和事务处理是放到一起的,这样本身就不好控制啊!
deanjiang 2002-04-27
  • 打赏
  • 举报
回复
这么多天也没个答案,看样子感兴趣的人不多。
我自己解决了,通过建立对象池,所有相关的任务都在同一个对象池中分配,每次把池中的所有对象同时锁定即可

不过分还是给大家分了吧
deanjiang 2002-04-26
  • 打赏
  • 举报
回复
zbill(土逗) :
一般情形下,比如Web服务器,每个Socket对应一个客户请求事务,这些事物之间基本上没有关系,互不影响,他们只在访问共享资源时进行一下同步、互斥就可以了。在我的程序中,事务之间的关系很密切,要互相进行操作,协调起来很困难
zbill 2002-04-26
  • 打赏
  • 举报
回复
你的问题我不太明白,我做过多线程的socket服务器!
deanjiang 2002-04-25
  • 打赏
  • 举报
回复
rovoboy(雪花满天):
我明白你的意思,将所有的请求排队,从而避免了同步问题。
在我的程序中并不只有这一个操作有类似问题,很难将所有的操作都队列化,而且真要这样做了,主要的处理工作都排队执行,效率可能无法接受(我写的是服务器端的程序,队列化后不能利用多CPU的的优势)。
我的程序的结构如下:
|子任务<子任务-〉Socket类 |
| . |
任 < . |
务 | . |子任务-〉Socket类 >Socket调度器(每个调度器对应一个线程)
|子任务<... |
|子任务-〉Socket类 |
rovoboy 2002-04-25
  • 打赏
  • 举报
回复
他们不需要直接删除对方,向一个删除器提交请求即可。
deanjiang 2002-04-25
  • 打赏
  • 举报
回复
死锁问题当然指的是对象,AB在不同的线程中都要删除对方,但各自的线程都已经将AB锁定了,所以他们都无法删除对方,于是死锁了。需要在程序结构上避免这种问题。
这应该是复杂的服务器变成都会碰上的。
nawu 2002-04-25
  • 打赏
  • 举报
回复
你的意思是删除A,B两个线程吗?
我觉的线程可以删除自己,因为所谓的删除只不过是释放线程的句柄资源,所以在线程内部可以删除然后自动结束线程函数的运行

pyq80(梦灵箫:宽频共享器是什么我很想知道

pyq80 2002-04-24
  • 打赏
  • 举报
回复
用宽频共享器可以实现。
DrunkenLion 2002-04-24
  • 打赏
  • 举报
回复
gz
deanjiang 2002-04-24
  • 打赏
  • 举报
回复
如果分不够可以再加,我有7000分

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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