免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3788 | 回复: 4
打印 上一主题 下一主题

一个简单的多线程程序的实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-03 19:14 |只看该作者 |倒序浏览
这个问题实在是不知道去哪里问,考虑到这里人多,所以发在了这里。

有一个程序流程,大致是这样的:
client request1 --> server response1 -->client request2 -->server response2
很常见的流程。问题在于server response1以后,需要等待client request2,然后继续流程。
单线程,没有问题。多线程,有问题。问题是:可能server在等待client A request2的时候,client B request1过来了,甚至client B request2也过来了。(或者可以简单的理解为:就是基于udp的网络程序.)
一般解决这种问题的方式,我能想到的有两种:
1,让整个流程基于连接,长连接的思路。这个在这里不适合,很容易造成造成server block.
2,手动制造一个session.既第一次response1开始一个session id,然后后续的请求必须带上本次session id.
这样的缺点是server 向client公布接口的时候,必须要带有个毫无意义的session id,且不说结构上不好看,放在整个数据的位置也不好选择(比如常见的,在http head中放点东西)。于是request1将成为一个独特的request,无法以统一的结构做饲服器处理。当然可以选择request 1也带有session id,然后抛弃.但是无论如何,这个session id是不应该出现在request中的,因为它是技术需要而不是业务需要.

我曾经想到,这和操作系统的多终端相似,比如多个终端给敲了键盘,服务器总能把这个事件准确地发给相应的程序.

不知道谁能指点下,给个简单的思路.

就是怎么样些程序,或者提供api,以调用方透明的方式知道,某个后续的request来自某个确定的session.

[ 本帖最后由 虎皮尖椒 于 2008-9-3 19:27 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-09-03 19:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2008-09-04 09:51 |只看该作者
如果是多线程,可以把接受请求的报文和回复的分成两个线程,处理两个list,list的元素是内容和client的基本信息。

接收线程收到req之后,把req和client信息加入到 待处理的list

处理线程取走待处理list中的req,处理完之后把res和client信息加入 待发送的list

发送线程按照 待发送的list 的client信息 发送回复报文

论坛徽章:
0
4 [报告]
发表于 2008-09-05 10:21 |只看该作者
原帖由 5毛党党员 于 2008-9-4 09:51 发表
如果是多线程,可以把接受请求的报文和回复的分成两个线程,处理两个list,list的元素是内容和client的基本信息。

接收线程收到req之后,把req和client信息加入到 待处理的list

处理线程取走待处理list中 ...

支持这种做法。
就是接收信息和发送信息是两个独立的线程。
当接收信息的线程接收到数据后,存放在一个list中list的元素可以是(re1,re2,result),然后处理信息的线程去list取数据处理程序,这个地方对list的操作比较讲究。
处理完成以后发送。

当然不用多线程也可以做

用poll数组轮询端口,然后在该进程中创建一个list做。
当一个连接创建的时候server就开放一个端口,可以根据端口号区别是哪个client 的re。

论坛徽章:
0
5 [报告]
发表于 2008-09-05 10:41 |只看该作者
原帖由 5毛党党员 于 2008-9-4 09:51 发表
如果是多线程,可以把接受请求的报文和回复的分成两个线程,处理两个list,list的元素是内容和client的基本信息。

接收线程收到req之后,把req和client信息加入到 待处理的list

处理线程取走待处理list中的req,处理完之后把res和client信息加入 待发送的list

发送线程按照 待发送的list 的client信息 发送回复报文


支持这个。

请求队列和请求应答队列分开处理比较好,不过你要同步好请求ID,否则回来的数据不晓得是哪个请求的,就没法处理了。
可以参照windows mobile的RIL层的设计思想。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP