2014-10-05 45 views
0

我正在学习c#信号量并且不理解一点。我可以这样初始化信号灯:信号量:了解请求的初始和最大数量

var semaphore = new Semaphore(4, 6); 

有很多地方这样的解释:

如果你想保留一些插槽调用线程,你可以通过第一个参数做 这样比第二小。

这是否意味着只有主线程可以使用剩余的2个资源插槽?是否这意味着如果我这样写:

var semaphore = new Semaphore(0, 6); 

只有主线程可以使用全部6个插槽?

回答

1

与锁(监视器)和互斥锁不同,信号量没有“所有者” - 它是线程无关的。任何线程都可以在信号量上调用Release,而使用Mutex和锁定时,只有获得锁的线程才能释放它。

初始值可用于初始化可同时授予的信号量请求数。它会为相关的sempahore设置当前可用的并发级别。

尽管最大计数可以设置可同时授予的信号量请求的最大数量。它为相关信号量设置了最大的潜在并发性。

您不能增加计数器CurrentCount大于您在初始化中设置的最大计数。

下面的示例演示信号量如何主题无关:

private static Semaphore semaphore = new Semaphore(3, 6); 

    private static void Main(string[] args) 
    { 
     //semaphore.Release(); //openning another slot for concurreny 

     semaphore.WaitOne(); 
     Console.WriteLine("main0"); 
     new Thread(() => 
     { 
      semaphore.WaitOne(); 
      Console.WriteLine("thread0"); 
      semaphore.WaitOne(); 
      Console.WriteLine("thread1"); 
      Thread.Sleep(3000); 
      Console.WriteLine("uncomment the release line to make main1 get in"); 

     }).Start(); 

     Thread.Sleep(1000); 
     semaphore.WaitOne(); 
     Console.WriteLine("main1"); 
     Console.ReadKey(); 
    } 

更多信息,看看http://www.albahari.com/threading/part2.aspx#_Semaphore

+0

好的,但剩下的2个插槽呢? – mtkachenko 2014-10-05 13:49:42

+0

@ maxim.tkachenko他们可以从其他线程使用,我更新了答案,并放置了一个示例,显示信号量如何与线程无关 – user3473830 2014-10-05 13:54:38

+0

对不起,可能我的答案不明确。如果我使用“新的Semaphore(4,6)” - 只有4个线程可以同时工作?当其他两个线程可用时? – mtkachenko 2014-10-05 14:02:11

0

我喜欢Albahari's explanation

旗号就像一个夜总会:它有一定的能力,由保镖执行。一旦它满了,没有更多的人可以进入,并在外面建立一个队列。然后,对于每个离开的人,一个人从队列的头部进入。构造函数至少需要两个参数:夜总会当前可用的地方数量和俱乐部的总容量。