仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 762|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET教程之.Net 下旌旗灯号量(Semaphore)的一种完成

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:34:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
说句实话,Java跨平台根本就不是外行人想想的那种,一次编译,处处运行。念头
从入手下手打仗多线(进)程编程模子入手下手,进修的就是和旌旗灯号量(Semaphore)相干的同步原语。不晓得为何.NetFramework里却没有响应的东东。要命的是,我之前有良多久经磨练的C++代码都是用她来完成的,为了不使反动先烈的药白吃,血白流,只好本人生一个了。
甚么是旌旗灯号量(Semaphore)
假如你已懂得旌旗灯号量(Semaphore)的观点了,请跳过这一段。

旌旗灯号量(Semaphore)是在多线程情况下利用的一种举措措施,它卖力和谐各个线程,以包管它们可以准确、公道的利用大众资本。
我们来看看一个泊车场是如何运作的。为了复杂起见,假定泊车场只要三个车位,一入手下手三个车位都是空的。这是假如同时来了五辆车,看门人同意个中三辆不受拦阻的进进,然后放下车拦,剩下的车则必需在出口守候,今后来的车也都不能不在出口处守候。这时候,有一辆车分开泊车场,看门人得知后,翻开车拦,放进一辆,假如又分开两辆,则又能够放进两辆,云云来去。
在这个泊车场体系中,车位是大众资本,每辆车比如一个线程,看门人起的就是旌旗灯号量的感化。
更进一步,旌旗灯号量的特征以下:旌旗灯号量是一个非负整数(车位数),一切经由过程它的线程(车辆)城市将该整数减一(经由过程它固然是为了利用资本),当该整数值为零时,一切试图经由过程它的线程都将处于守候形态。在旌旗灯号量上我们界说两种操纵:Wait(守候)和Release(开释)。当一个线程挪用Wait守候)操纵时,它要末经由过程然后将旌旗灯号量减一,要末一自等下往,直到旌旗灯号量年夜于一或超时。Release(开释)实践上是在旌旗灯号量上实行加操纵,对应于车辆分开泊车场,该操纵之以是叫做“开释”是应为加操纵实践上是开释了由旌旗灯号量保卫的资本。
完成
人人都晓得,.NetFramework类库中供应的线程同步举措措施包含:
Monitor,AutoResetEvent,ManualResetEvent,Mutex,ReadWriteLock和InterLock。个中AutoResetEvent,ManualResetEvent,Mutex派生自WaitHandler,它们实践上是封装了操纵体系供应的内查对象。而别的的应该是在.Net假造机中土生土长的。明显来自操纵体系内查对象的举措措施利用起来效力要差一些。不外效力并非我们这里要思索的成绩,我们将利用两个Monitor和一个ManualResetEvent工具来摹拟一个旌旗灯号量。
代码以下:
publicclassSemaphore
{
privateManualResetEventwaitEvent=newManualResetEvent(false);
privateobjectsyncObjWait=newobject();
privateintmaxCount=1;file://最年夜资本数
privateintcurrentCount=0;file://以后资本数
publicSemaphore()
{
}
publicSemaphore(intmaxCount)
{
this.maxCount=maxCount;
}
publicboolWait()
{
lock(syncObjWait)file://只能一个线程进进上面代码
{
boolwaitResult=this.waitEvent.WaitOne();file://在此守候资本数年夜于零
if(waitResult)
{
lock(this)
{
if(currentCount>0)
{
currentCount--;
if(currentCount==0)
{
this.waitEvent.Reset();
}
}
else
{
System.Diagnostics.Debug.Assert(false,"Semaphoreisnotallowcurrentcount<0");
}
}
}
returnwaitResult;
}
}
/**////<summary>
///同意超时前往的Wait操纵
///</summary>
///<paramname="millisecondsTimeout"></param>
///<returns></returns>
publicboolWait(intmillisecondsTimeout)
{
lock(syncObjWait)//Monitor确保该局限类代码在临界区内
{
boolwaitResult=this.waitEvent.WaitOne(millisecondsTimeout,false);
if(waitResult)
{
lock(this)
{
if(currentCount>0)
{
currentCount--;
if(currentCount==0)
{
this.waitEvent.Reset();
}
}
else
{
System.Diagnostics.Debug.Assert(false,"Semaphoreisnotallowcurrentcount<0");
}
}
}
returnwaitResult;
}
}

publicboolRelease()
{
lock(this)//Monitor确保该局限类代码在临界区内
{
currentCount++;
if(currentCount>this.maxCount)
{
currentCount=this.maxCount;
returnfalse;
}
this.waitEvent.Set();file://同意挪用Wait的线程进进
}
returntrue;
}
}
我实在想不明白java的机制,为什么非要那么蛋疼,在同一个平台下重复编译。
柔情似水 该用户已被删除
沙发
发表于 2015-1-19 17:42:21 | 只看该作者
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
海妖 该用户已被删除
板凳
发表于 2015-1-27 21:45:20 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
再现理想 该用户已被删除
地板
发表于 2015-2-5 11:51:46 | 只看该作者
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
精灵巫婆 该用户已被删除
5#
发表于 2015-2-11 16:10:21 | 只看该作者
asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
爱飞 该用户已被删除
6#
 楼主| 发表于 2015-3-2 15:47:17 | 只看该作者
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
小女巫 该用户已被删除
7#
发表于 2015-3-11 04:28:49 | 只看该作者
我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。
若相依 该用户已被删除
8#
发表于 2015-3-17 20:41:38 | 只看该作者
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
不帅 该用户已被删除
9#
发表于 2015-3-25 00:53:02 | 只看该作者
它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-5 14:45

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表