我正在学习c#信号量并且不理解一点。我可以这样初始化信号灯:信号量:了解请求的初始和最大数量
var semaphore = new Semaphore(4, 6);
有很多地方这样的解释:
如果你想保留一些插槽调用线程,你可以通过第一个参数做 这样比第二小。
这是否意味着只有主线程可以使用剩余的2个资源插槽?是否这意味着如果我这样写:
var semaphore = new Semaphore(0, 6);
只有主线程可以使用全部6个插槽?
我正在学习c#信号量并且不理解一点。我可以这样初始化信号灯:信号量:了解请求的初始和最大数量
var semaphore = new Semaphore(4, 6);
有很多地方这样的解释:
如果你想保留一些插槽调用线程,你可以通过第一个参数做 这样比第二小。
这是否意味着只有主线程可以使用剩余的2个资源插槽?是否这意味着如果我这样写:
var semaphore = new Semaphore(0, 6);
只有主线程可以使用全部6个插槽?
与锁(监视器)和互斥锁不同,信号量没有“所有者” - 它是线程无关的。任何线程都可以在信号量上调用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
旗号就像一个夜总会:它有一定的能力,由保镖执行。一旦它满了,没有更多的人可以进入,并在外面建立一个队列。然后,对于每个离开的人,一个人从队列的头部进入。构造函数至少需要两个参数:夜总会当前可用的地方数量和俱乐部的总容量。
好的,但剩下的2个插槽呢? – mtkachenko 2014-10-05 13:49:42
@ maxim.tkachenko他们可以从其他线程使用,我更新了答案,并放置了一个示例,显示信号量如何与线程无关 – user3473830 2014-10-05 13:54:38
对不起,可能我的答案不明确。如果我使用“新的Semaphore(4,6)” - 只有4个线程可以同时工作?当其他两个线程可用时? – mtkachenko 2014-10-05 14:02:11