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-30 18:10:01

WaitHandle——使用Semaphore的相关文章

CLR 线程同步

CLR 基元线程同步构造 <CLR via C#>到了最后一部分,这一章重点在于线程同步,多个线程同时访问共享数据时,线程同步能防止数据虽坏.之所以要强调同时,是因为线程同步问题其实就是计时问题.为构建可伸缩的.响应灵敏的应用程序,关键在于不要阻塞你拥有的线程,使它们能用于(和重用于)执行其他任务. 不需要线程同步是最理想的情况,因为线程同步存在许多问题: 1 第一个问题是,它比较繁琐,很容易出错. 2 第二个问题是,它们会损坏性能.获取和释放锁是需要时间的,因为要调用一些额外的方法,而且不同

NETCLRvia&lt;5.2&gt;

基元线程同步构造 构建可伸缩的,响应灵敏的应用程序,关键在于不要阻塞线程, 多个线程同时访问共享数据,获取并释放一个线程同步锁.锁会损害性能,获取和释放锁是需要时间的.只允许一个线程访问共享资源,可以使用值类型,多个线程对共享数据进行只读访问是没有任何问题的. 类库和线程安全 FCL保证所有静态方法都是线程安全的.多个线程调用同一个静态方法,并不是说方法内部会获取一个同步锁,也可能内部数据是值类型. FCL没有保证实例方法是线程安全的. 所有的静态方法都是线程安全的,所有实例方法都是非线程安全.

C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex System.Threading.Semaphore System.Threading.EventWaitHandle System.Threading.ManualResetEvent System.Threading.AutoResetEvent System.Object System.Thre

多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent

介绍 本章主要说下基于内核模式构造的线程同步方式,事件,信号量. 目录 一:理论 二:WaitHandle 三:AutoResetEvent 四:ManualResetEvent 五:总结 一:理论 我们晓得线程同步可分为,用户模式构造和内核模式构造. 内核模式构造:是由windows系统本身使用,内核对象进行调度协助的.内核对象是系统地址空间中的一个内存块,由系统创建维护. 内核对象为内核所拥有,而不为进程所拥有,所以不同进程可以访问同一个内核对象, 如进程,线程,作业,事件,文件,信号量,互

【深度好文】多线程之WaitHandle--&gt;派生-》Semaphore信号量构造

Semaphore 继承自WaitHandle. 信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量. //创建一个限制资源类 //资源数为5,开放资源数为2 //主线程自动占有3个资源 semaphore = new Semaphore(2, 5); 那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程调用了 这个Semaphore,那么它的计数器就会相应的减1,直到这个计数器变为0.这时,如果有另一

【C#】【Thread】Semaphore/SemaphoreSlim信号量

System.Threading.Semaphore 类表示一个命名(系统范围)信号量或本地信号量. 它是一个对 Win32 信号量对象的精简包装. Win32 信号量是计数信号量,可用于控制对资源池的访问.      SemaphoreSlim 类表示一个轻量的快速信号量,可用于在一个预计等待时间会非常短的进程内进行等待. SemaphoreSlim 会尽可能多地依赖由公共语言运行时 (CLR) 提供的同步基元. 但是,它也会根据需要提供延迟初始化的.基于内核的等待句柄,以支持等待多个信号量.

Semaphore and SemaphoreSlim

https://msdn.microsoft.com/en-us/library/z6zx288a(v=vs.110).aspx The System.Threading.Semaphore class represents a named (systemwide) or local semaphore. It is a thin wrapper around the Win32 semaphore object. Win32 semaphores are counting semaphores

C#多线程--信号量(Semaphore)

百度百科:Semaphore,是负责协调各个线程, 以保证它们能够正确.合理的使用公共资源.也是操作系统中用于控制进程同步互斥的量. Semaphore常用的方法有两个WaitOne()和Release(),Release()的作用是退出信号量并返回前一个计数,而WaitOne()则是阻止当前线程,直到当前线程的WaitHandle 收到信号.这里我举一个例子让大家更容易理解:当我们这样实例化Semaphore时候 Semaphore sema = new Semaphore( x , y );

WaitHandle学习笔记

信号量与互斥体 互斥体(Mutex)是操作系统中一种独占访问共享资源的机制.它像一把所锁,哪个线程获取到互斥体的控制权,则可以访问共享的资源,或者执行处于受保护的代码.而其他的线程如果也想获取控制权,则需要要阻塞等待,知道拥有控制权的线程释放控制权. 信号量(Semaphore)是操作系统中协调多个线程访问共享资源的机制.他内部维护一个非负整数计数器.0表示不能再接受更多的共享访问请求,大于零的数值X表示最多还能接受X个线程的共享访问请求.而非负整数的操作只能通过wait()或者signal()