编写一个聊天室 关于读写锁的问题 帮忙给个思路……

duandi 发布于 2012/03/22 13:18
阅读 184
收藏 2

看了《深入理解计算机系统》 最后两章讲了一个简单的web server 用Linux C完成的

于是想用这个来做一个网页版的聊天室 一开始只想到了一个效率很低的方案

页面每隔一定时间刷新一次 向服务器请求数据 点击发送消息向服务器发送消息

这些请求和发送的数据都来自内存中开辟的一块缓存 但是如果有很多读者和写者

很容易有一方长时间阻塞 越想越觉得这个思路太不对劲了 搜索了下关于聊天室的 好像从来没有关于读写锁方面的 我怀疑我思路完全不对……

也想过用websocket但是那个更不熟悉 而且别人都是用python什么写的 我只会C

求给个正确的思路 能让我用C完成

加载中
0
中山野鬼
中山野鬼

你这个是多点同步的问题。其实这个问题,数学模型上和分布数据库中有些技术是很像的。

不妨我们抽象一下,将所有客户端归入集合A,服务器端归入集合B,很显然,集合B我们只有一个元素,因为你始终存在一个中央集权的总控系统。

注:需要说明,有些新手喜欢就问题想问题,描述问题,如果不抽象,很多事情不能说清楚。

分裂成A,B的目的是,区分一下功能分配。

实际上所有的生产,是由A产生的。假设你不变态到,要记录所有聊天记录以给警察叔叔查询,如果QQ那样,那么你的B实际只是完成一个对A集合所有成员的数据同步的工作。

我就不把模型从最简单,最原始的开始演变了。直接讲后面的。

假设,A中任意两个成员(实际数学用语叫元素,我就不那么标准了望专家无笑),分别产生各自数据,而同步包含了队列排序的工作。也就是说A的任意两个成员的生产数据,实际存在有序性。

由此,B的同步工作必然包含有序性的抉择。为了降低B的工作量,可以将有序性的前导工作(就是前面部分的工作),推送到A的成员中完成。

B 将以下内容推送给A的每个成员自己完成。

A集合所有成员在一个时间窗口内生产出来的数据。

而同时,A的任意成员推送给B的成员的内容则为

A在当前时间窗口内产生的新数据内容。

楼到具体问题上 就是:

你每个客户端是等同的。每个时间窗口,将自身产生的数据发送给服务器。而服务器响应后,会将上个时间窗口的所有客户端收集上来的数据打包发给你。但此时并不包含你 当前发送的数据所在时间窗口的数据。

此时,你 客户端,需要根据接收的打包数据,根据每个数据的同步时间戳和生产者信息,依次重新排列。

duandi
duandi
多谢回答了这么多 我水平有限 仔细消化下
0
中山野鬼
中山野鬼

建议你把设计,从简单原型堆起,再细化和工程化。

1、完成3个 事情。

a、网络的握手和数据来回传递,就是客户端发个请求给服务器,接通后,发送个数据包,服务器也发个数据包,你别关心数据包里面内容。

b、客户端生产数据。哪怕把一个会改变的值产生出来。

c、服务器端,完成数据的打包,客户端完成数据的解包工作(不是网络协议,是你自己的协议,在网络协议之上)

以上工作除了a其他都是可以独立完成.

2、针对第1步的a已经完成下,细化三个部分的工作,客户端,服务器段,网络。但网络部分放在最后。

客户端主要是增加你的UI等应用设计。服务器端主要是框定下总支持容量等。

3、工程化,对各个部分进行监测,判断瓶颈,修正实现方法,或增加复杂的逻辑,提升效率,使得能够实用。

返回顶部
顶部