常用知识总结——信号量

本文转自http://www.cnblogs.com/tianzhiliang/archive/2010/08/31/1813635.html

信号量 Semaphore

类似互斥锁,但它可以允许多个线程同时访问一个共享资源

通过使用一个计数器来控制对共享资源的访问,如果计数器大于0,就允许访问,如果等于0,就拒绝访问。计数器累计的是“许可证”的数目,为了访问某个资源。线程必须从信号量获取一个许可证。

通常在使用信号量时,希望访问共享资源的线程将尝试获取一个许可证,如果信号量的计数器大于0,线程将获取一个许可证并将信号量的计数器减1,否则先线程将阻塞,直到获取一个许可证;当线程不再需要共享资源时,将释放锁拥有的许可证,并将许可证的数量加1,如果有其他的线程正在等待许可证,那么该线程将立刻获取许可证。

另外,允许同时访问的资源的进程数量是在创建信号量时指定的,如果创建一个允许进程访问的信号量数目为1,则该信号量就和互斥锁的用法一样。

Public Semaphore(int initialCount,int maximumCount)

initialCount指信号量许可证的初始值,maximumCount为最大值

获取许可证使用WaitOne()

不需要时释放使用 public int Release();或者public int Release(int  releaseCount);

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
 
using  System.Threading;
 
namespace  MyTTCon
{
     class  mythread
     {
         public  Thread thrd;
         //创建一个可授权2个许可证的信号量,且初始值为2
         static  Semaphore sem = new  Semaphore(2, 2);
 
         public  mythread( string  name)
         {
             thrd = new  Thread( this .run);
             thrd.Name = name;
             thrd.Start();
         }
         void  run()
         {
             Console.WriteLine(thrd.Name + "正在等待一个许可证……" );
             //申请一个许可证
             sem.WaitOne();
             Console.WriteLine(thrd.Name + "申请到许可证……" );
             for  ( int  i = 0; i < 4 ; i++)
             {
                 Console.WriteLine(thrd.Name + ": "  + i);
                 Thread.Sleep(1000);
             }
             Console.WriteLine(thrd.Name + " 释放许可证……" );
             //释放
             sem.Release();
         }
     }
 
     class  mysemaphore
     {
         public  static  void  Main()
         {
             mythread mythrd1 = new  mythread( "Thrd #1" );
             mythread mythrd2 = new  mythread( "Thrd #2" );
             mythread mythrd3 = new  mythread( "Thrd #3" );
             mythread mythrd4 = new  mythread( "Thrd #4" );
             mythrd1.thrd.Join();
             mythrd2.thrd.Join();
             mythrd3.thrd.Join();
             mythrd4.thrd.Join();
         }
     }
}

 


你可能感兴趣的:(thread,线程,Semaphore)