国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 服务器 > WaitHandle――使用Semaphore

WaitHandle――使用Semaphore

来源:程序员人生   发布时间:2015-01-24 08:42:22 阅读次数:3007次



    semaphore也继承自waithandle,它用于锁机制,与Mutex不同的是,它允许指定数量的线程同时访问资源,在线程超过数量以后,则进行排队等待,直到之前的线程退出。

    Semaphore很合适利用于web服务器这样的高并发场景,可以限制对资源访问的线程数。


    Monitor与monitor都有1个锁持有者,而semaphore则不需要,因此通常将sempahore声明为静态的。


 

   来看下面的示例:


namespace 使用Semaphore { class Program { //第1个参数指定当前运行多少条线程进入,第2个参数表示 允许多少个线程同时进入 static Semaphore sem = new Semaphore(2, 2); static void Main(string[] args) { for (int i = 1; i <=4; i++) { new Thread (ThreadEntry).Start (i); } } static void ThreadEntry(object id) { Console.WriteLine("thread {0} wants to get in",id); sem.WaitOne(); //在调用waitone方法时,如果有空位,则占位;如果没有,则等待; Console.WriteLine("thread {0} gets in",id ); Thread.Sleep(100); Console.WriteLine("thread {0} is leaving",id ); sem.Release(); //释放1个空位; } } }


调用结果:



 



     假想下,如果有1个抢票的页面,所有人同1时刻并发访问,可以用此对象设置好并发的人数和同时可以有多少人进入等待状态。其他人可以排到1个队列中,如果队列太长的话,会造成服务器内存消耗过量,这时候,可以采取散布式的方法,把队列分配到不同的主机上,减轻服务器压力。


   以上假想还未在实践中使用过,但是学习了两天如何处理高并提问题,这也算是理出来的1个思路吧。






生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生