游戏大厅 从基础开始(7)--绕回来细说聊天室(中间偏下)之女仆编年史2

 

老少爷们儿反击战

上一篇中 我们的女仆终于可以做一些像阳光下其他人一样的事情了,少爷们可以和女仆酱一起参加下午茶~ 难得的上流社会啊

这是永远1v1被人私有的女奴 喝茶时被人共有的女仆酱最明显的差异~

明媚的午后阳光下,庭院里白色长餐桌两旁,英俊的少爷们彼此交换着最近的趣闻轶事,一面欣赏女仆酱以1/3几率打翻茶水,可爱而笨笨地努力侍奉着,闪闪发光的样子。

人间极乐喵~~~~~~~~~~   :3

但距离真正的自由~~无Lock还是很远,很远。

因为,

老爷和少爷的调教仍然是一如既往的频繁! 女仆酱你仍然是伟大的老少爷们的东西~!

 

我们看上一次所说的调用聊天室方式:

 

Code Snippet
  1.        Channel cr = session["Chat"];
  2.             cr.Say(Request["text"]);
  3.             foreach (var s in cr.Listen())
  4.             {
  5.                 Response.write("<p>");
  6.                 Response.write(s);
  7.                 Response.write("</p>");
  8.             }

这个行程可不得了

 

  1. 女仆来~~ (get instance)
  2. 调教~!(Say & writelock)
  3. 喝茶~!(Listen & readlock)

所有的少爷和老爷都是这个行程  执事先生,您是恶魔执事来的吧!(塞巴斯酱邪媚一笑)

虽然效率高了近一倍,但是 在奉茶的时候 仍然有调教的队伍大排长龙~

 

image

 

这让老少爷们很是不 不不爽 ! “主人样”们是不会这样满足地口胡!~ 啊 太激动了,咽口水先。

-------------------------------------------------------------------------------------

最年轻的少爷在某个风和日丽的下午茶时间 提出了一个邪恶点子:

“既然我们喝茶的时候只是想看着女仆酱,又不是真的希望她倒茶,为啥我们不能一边看着别人调教女仆酱  一边喝茶呢?”

 

 

 

全体老少爷们的红茶都化作血雾喷洒在无瑕的桌上,纷纷气绝。

 

小少爷解释道:

既然数据池实际上是一个队列  而加入队列仅仅是对队列头有所操作,

那么在已经访问过的节点另一端加入的内容 对于已经开始访问内部内容的线程来说是毫无意义的

 

 image

 

为了“不存在”的变化加锁,这又是何苦呢?

 

“囊得斯嘎!?”

“艘得斯嘎!!”

“游息!!”

爬起来的各位纷纷恍然大悟装,激动地握住彼此的手,泛着泪光。。。。

 

 

 

可是为什么我们之前要加锁呢?

深入研究Queue<T> 的源代码  我们了解到 Queue<T>的实现方法:定长数组实现的循环队列

不熟悉循环队列的兄弟们可以参考博友刺儿头的文章

当每次 ToArray的时候 Queue<T>执行下面的操作

 

Code Snippet
  1.         public T[] ToArray()
  2.         {
  3.             T[] destinationArray = new T[this._size];
  4.             if (this._size != 0)
  5.             {
  6.                 if (this._head < this._tail)
  7.                 {
  8.                     Array.Copy(this._array, this._head, destinationArray, 0, this._size);
  9.                     return destinationArray;
  10.                 }
  11.                 Array.Copy(this._array, this._head, destinationArray, 0, this._array.Length - this._head);
  12.                 Array.Copy(this._array, 0, destinationArray, this._array.Length - this._head, this._tail);
  13.             }
  14.             return destinationArray;
  15.         \

同时有人Enqueue的时候  _size _head  _tail 都可能被并发修改

Code Snippet
  1.     public void Enqueue(T item)
  2.         {
  3.             if (this._size == this._array.Length)
  4.             {
  5.                 int capacity = (int)((this._array.Length * 200L) / 100L);
  6.                 if (capacity < (this._array.Length + 4))
  7.                 {
  8.                     capacity = this._array.Length + 4;
  9.                 }
  10.                 this.SetCapacity(capacity);
  11.             }
  12.             this._array[this._tail] = item;
  13.             this._tail = (this._tail + 1) % this._array.Length;
  14.             this._size++;
  15.             this._version++;
  16.         }

太危险了!

 

我们是为了保障这些关键标记量才用的Lock  这是数组内核本身限制造成的:( 

我们一开始就陷入了  “要用队列,M$提供了队列”的心理陷阱,

——果然观赏女仆酱一定要喝茶是错误的常识

——看来聊天数据池还真的不能拿来主义

 

对于微软类库做不到的 我们一定要有自己的实现。 所以女仆酱啊,你的末日到了欧欧欧欧喝喝喝喝喝喝HiaHiaHia …..

 

敬请期待下一篇:

垃圾列表

转载于:https://www.cnblogs.com/waynebaby/archive/2009/08/22/1552206.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转载】App.config/Web.config 中特殊字符的处理

写一个网站&#xff0c;遇到一个问题&#xff0c;发布以后&#xff0c;提示错误&#xff0c;但是即使打开错误提示&#xff08;在web.config中打开&#xff09;&#xff0c;还是只提示错误&#xff0c;没提示什么地方错误&#xff0c;这让我知道了&#xff1a;是webconfig本身的…

C++远航之封装篇——类外定义和::

1、类内定义是把函数的具体实现写在类内部&#xff0c;默认是inline函数。 2、类外定义包含两种情况&#xff1a; &#xff08;1&#xff09;同文件类外定义 &#xff08;2&#xff09;不同文件类外定义

pipeline代码自动生成

如图所示&#xff0c;安装完插件后&#xff0c;Sample Step里就有相应的选项&#xff0c;选择某个选项后&#xff0c;点击Generate Pipeline Script按钮&#xff0c;就可以自动生成代码片段&#xff0c;然后放入pipeline流水线里就可以了 pipeline使用的是groovy脚本&#xff0…

一个简单的基于socket的通讯处理程序

2019独角兽企业重金招聘Python工程师标准>>> 这几天看书看得java网络编程&#xff0c;看到一个不错的&#xff0c;适合新手的&#xff0c;部分代码借鉴书上的&#xff0c;可能有地方还不是很成熟&#xff0c;不过可以借鉴一下&#xff0c;分为客户端和服务端&#x…

C++远航之封装篇——构造函数

1、为什么需要构造函数&#xff1f; 见博客http://blog.csdn.net/zhhymh/article/details/6236317 2、c中的内存分区 &#xff08;1&#xff09;栈区 int x0&#xff1b;int *pNULL&#xff1b; &#xff08;2&#xff09;堆区 int *p new int[20]; &#xff08;3&#xff0…

安装win_server_2012的方法

1、从微软官网下载评估版。 2、查看你的当前版本。以管理员身份运行cmd&#xff0c;然后输入“DISM /online /Get-CurrentEdition”。如果是评估版&#xff0c;例如Standard&#xff0c;把“ServerStandardEval”中的Eval这四个字母去掉&#xff0c;就是你的当前版本。下图表明…

DHCP中继处理办法

这两天一直在客户这边测试DHCP&#xff0c;由于客户的网络是现成的server 2008 是后来加上去的&#xff0c;所以没有多的IP地址用于测试&#xff0c;只好拿客户的楼层网段来测试&#xff0c;由于需要跨VLAN实行DHCP地址分配&#xff0c;所有需要做DHCP中继。废话不多说&#xf…

C++远航之封装篇——默认构造函数、初始化列表、拷贝构造函数

1、默认构造函数 没有参数&#xff1b;若有参数&#xff0c;则一定全部都有默认的参数值。 2、初始化列表 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特性 建议用初始化列表来初始化数据成员。初始化列表先于构造函数执行&#xff1b;初始化列表只能用于构造函…

C++远航之封装篇——析构函数

一、为什么需要析构函数&#xff1f; 见博客&#xff1a;http://blog.csdn.net/zhhymh/article/details/6239832 二、析构函数的理解 1、格式 2、必要性 释放资源。 3、什么时候调用&#xff1f; delet p时会调用析构函数&#xff1b;程序返回时&#xff0c;也会调用析构函数…

生成的数据库脚本没有注释?

1,选择Database->Generate Database 选中Generate name in empty comment就可以了转载于:https://www.cnblogs.com/hongjiumu/archive/2012/08/02/2620379.html

HDU 1312

View Code 1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 以前用BFS写过&#xff0c;这次改用DFS写发现DFS掌握的不好&#xff0c;挑了好久才过&#xff0c;今下午才AC了两道题&#xff0c;还要加紧练习DFS&#xff01;5 int row,col,coun…

C++远征之封装篇——对象数组,对象成员

一、对象数组 &#xff08;1&#xff09;如下&#xff0c;delet [ ]p时&#xff0c;会调用三次析构函数 &#xff08;2&#xff09;细节 实例化对象数组时&#xff0c;每一个对象的构造函数都会被执行。销毁对象数组时&#xff0c;每一个对象的析构函数都会被执行。 二、对象成…

ehcache memcache redis 三大缓存男高音

2019独角兽企业重金招聘Python工程师标准>>> 最近项目组有用到这三个缓存&#xff0c;去各自的官方看了下,觉得还真的各有千秋&#xff01;今天特意归纳下各个缓存的优缺点&#xff0c;仅供参考&#xff01; Ehcache 在java项目广泛的使用。它是一个开源的、设计于…

C++远航之封装篇——深拷贝、浅拷贝

1、浅拷贝 如下&#xff0c;此时如果同一块内存释放两次&#xff0c;会报错 2、深拷贝

C++远航之封装篇——对象指针、this指针

1、使用new会调用构造函数&#xff0c;使用malloc不会使用构造函数。 2、加不加括号都行&#xff1f;YES 3、对象成员指针&#xff08;指针指向对象&#xff0c;而这对象是数据成员&#xff09; 4、this指针 下面这个没有歧义&#xff1a; 而下面这个有歧义&#xff1a; 为此&a…

poj 1274 The Perfect Stall

2019独角兽企业重金招聘Python工程师标准>>> The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16888 Accepted: 7721 Description Farmer John completed his new barn just last week, complete with all the latest milkin…

C++远征之封装篇——常对象成员、常成员函数

一、常对象成员 二、常成员函数 &#xff08;1&#xff09;常成员函数中不能修改数据成员的值 &#xff08;2&#xff09;不能修改的原因 每个函数都默认带了一个this指针的&#xff0c;该指针指向该类的实例。当使用const来修饰时&#xff0c;其实是const Coordinate* this。这…

PHP建站环境搭建:汇总网上常见的1键安装包

PHP的程序很火&#xff0c;像博客&#xff1a;Wordpress、论坛&#xff1a;Discuz!、SNS&#xff1a;UCenter Home、CMS&#xff1a;DedeCMS等等都是比较流行的PHP程序&#xff0c;大家都在使用PHP类的程序&#xff0c;但对于很多初学者来说&#xff0c;直接上传到虚拟空间上一…

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和文章作者&#xff1a;Yx.Ac 文章来源&#xff1a;勇幸|Thinking (http://www.ahathinking.com) 转载请注明&#xff0c;谢谢合作。 以后新博客写的文章挑一些粘过来&#…

JEECMS编辑漏洞及随便拿webshell,啊哈哈

JEECMS是基于java技术开发&#xff0c;继承其强大、稳定、安全、高效、跨平台等多方面的优点 采用SpringMVC3Spring3Hibernate3Freemarker主流技术架构 安全性做得非常变态&#xff0c;当网站安装完成后就不再允许执行任何目录下的jsp文件了&#xff08;web.xml配置了过滤器禁…