支持HW团队,就支付宝领取下面的红包吧!(2018年3月31前,就几毛,也会几块,可以和其他红包叠加使用),你领取消费,HW有奖励。红包使用无条件限制,有条件请注意是不是有病毒。

小伙伴们,给大家发红包喽!人人可领,领完就能用。祝大家领取的红包金额大大大!#吱口令#长按复制此消息,打开支付宝就能领取!er1OEj73Uj

登入 注册 | 验证
| 搜索
HelloWorld论坛 : > 计算机科学、技术、教学> 编程入门> c、c++基础> [原创]单线程模型
 
 
 
 
类别:算法 阅读:4904 评论:0 时间:五月 4, 2013, 11:42 a.m. 关键字:单线程 并发

 

这是对 [原创]并发到达的事件,串行处理(还有遗漏,请指教)的改进,也许有些人觉得这个没什么技术,但是我觉得有必要整理一下。

服务器开发主要就是提高并发,最简单的方法是开辟一组线程,然后把一组事件放到线程中去处理,这时候我们往往要对访问临界资源进行加锁。例如:开辟10个线程,有100个文件对象,有1000多个对不同文件的读写操作(这个传说中的读写问题不一样,这里是一个文件对象,同一个时间只能读或者写),一个文件读,或者写,另外一个线程肯定不能用这个文件对象进行读或者写,那么,我们必须互斥操作。如果所有线程取到的事件刚好是对一个文件对象的操作,那么只能一个线程执行事件,其他线程被互斥等待,这样就大大降低服务器的并发能力,和反应速度。也许可以不互斥等待,但执行事件的时候去取文件锁,发现文件已经锁定,就把事件重新放人事件队尾。这样服务器的反应速度快了,但是当其中一个事件很费时间,事件队列中又只剩下这个文件对象的操作的时候。我们就会发现,只有一个线程在工作,其他线程都在空转,取事件,判断文件被锁,重新放入事件,这样cpu肯定不会低的。其次有时候我们需要一个对象的处理事件按照顺序来执行,这个是乱序执行的。

单线程模型的定义

定义这样一个类(单线程类),为每个文件对象生产一个该类的对象(单线程对象)并绑定。
对文件对象的读写操作放入对应的单线程对象中,单线程对象在自己有事件要处理的时候,
会往线程队列放入一个单线程对象要执行事件。
单线程执行这个事件,单线程对象就会依次处理完自己的事件。

    看上一片文章,里面的处理完全正确,但是后来有个程序发现很卡,后来一分析,是如上所说,空转太多,白白消耗cpu。现在改进如下,主要还是两部分组成:

单线程类有数据成员如下:

1.事件队列。

2.事件队列读取标志。false,表示不会读取,true,表示将会读取。

3.事件队列锁。锁内才能修改事件队列读取标志为false。

4.事件执行锁,读取事件,执行事件锁住,保证只有一个运行。

事件到达,放入单线程对象队列

1、事件队列加入事件。(队列为临界资源,要安全放入,可以使用事件队列锁)
2、锁事件队列锁
3、看事件队列读取标志,为false,而且事件队列不为空,往线程队列插入一个本对象要运行事件
4、解开事件队列锁

单线程对象的处理函数,取事件:

1、取得事件执行锁,得到并要求锁住,得不到,跳到8
2、事件队列读取标志为true,将会读取事件队列
3、锁事件队列锁
4、读取事件队列,有读取,解锁事件队列锁,执行4,。没有事件队列读取标志为false,解锁事件队列锁,跳到8。
5、处理事件
6、重复3、4、5,
7、解锁事件执行锁
8、锁事件队列锁
9、看事件队列读取标志,为false,而且事件队列不为空,往线程队列插入一个本对象要运行事件
10、解开事件队列锁

 

相关博文 首页 上页 1 2 下页 尾页 共2条
[挂载人]初学MPEG [审核人]初学MPEG 推荐

个人签名--------------------------------------------------------------------------------

Please Login (or Sign Up) to leave a comment