WaitHandle——使用Semaphore

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

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

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

 

   来看下面的示例:

namespace 使用Semaphore
{
    class Program
    {

         //第一个参数指定当前运行多少条线程进入,第二个参数表示 允许多少个线程同时进入
        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();  //释放一个空位;

        }
    }
}

调用结果:

 

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

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

时间: 2024-09-20 00:20:30

WaitHandle——使用Semaphore的相关文章

Windows 8 Store Apps学习(47) 多线程之线程同步: Semaphore等

多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent 介绍 重新想象 Windows 8 Store Apps 之 线程同步 Semaphore - 信号量 CountdownEvent - 通过信号数量实现线程同步 Barrier - 屏障 ManualResetEvent - 手动红绿灯 AutoResetEvent - 自动红绿灯 示例 1.演示 Semaphore 的使用 Thread

重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent

原文:重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent [源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent 作者:webabcd 介绍重新想

关于c# semaphore 的这个异常

问题描述 2015-09-2115:47:29,332[5862]ERRORxxx-System.Threading.ThreadAbortException:at(wrappermanaged-to-native)System.Threading.WaitHandle:WaitOne_internal(System.Threading.WaitHandle,intptr,int,bool)atSystem.Threading.WaitHandle.WaitOne()<0x42480440+0x

并发工具类(三)控制并发线程数的Semaphore

简介 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表

ASP.NET教程:WaitHandle类

当程序运行时,碰到了一个问 题,如果WaitHandle数组超过64个元素之后,WaitHandle对象的WatiAll方法罢工了.后来为了程序能运行,只得想了一个笨办法: 先创建两个WaitHandle对象放在数组,然后用循环两个两个地运行任务. 最近笔者在用.Net写程序时遇到一个问题:有N个互不相关的任务要在线程池中跑,但有一个线程要等待N个任务完成之后才能继续.而这个N是个未知数,可能会 很大(因此才会想到使用线程池而不是手动去new一个therad).翻了翻.Net类库的文档,发现一个

.Net 下信号量(Semaphore)的一种实现

动机     从开始接触多线(进)程编程模型开始,学习的就是和信号量(Semaphore)相关的同步原语.不知道为什么 .Net Framework 里却没有相应的东东.要命的是, 我以前有很多久经考验的C++代码都是用她来实现的, 为了不使革命先烈的药白吃, 血白流, 只好自己生一个了. 什么是信号量(Semaphore)     如果你已经了解信号量(Semaphore)的概念了,请跳过这一段.        信号量(Semaphore)是在多线程环境下使用的一种设施, 它负责协调各个线程,

如何使用System V Semaphores API实现POSIX Semaphore API

概述 在将代码移植到 z/OS 平台时,您会面临的一个重要挑战是 POSIX semaphore API 在 z/OS 上的可用性. 通常,在 Linux/UNIX/Windows 平台上运行的很多程序都是用 POSIX semaphore 开发的. 这个问题的一个解决方案 是使用 System V API 代替 POSIX API 来实现 z/OS.这会涉及到整个代码中大量的代码更改,以及大量的编写和测试工作 .另一个更好的解决方案是使用可用的 System V API 在 z/OS 中实现

C#使用semaphore来管理异步下载请求的方法

  本文实例讲述了C#使用semaphore来管理异步下载请求的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 var semaphor = new Semaphore(50, 50); // We allow at most 50 threads for crawling var resultPins = new List<Pin>(); // Res

Semaphore维护当前访问自身的线程个数

可以实现流量控制,同时访问文件的用户数 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreTest {     public static void main(String[] args) {         ExecutorService service =