我想拥有这个Threads层次结构:
10个线程(让我们称之为1-10):每个创建2个线程(让我们调用线程1线程1A,1B ......由第二个线程2A,2B等创建的线程)。
1A等待lockerA以及2A,3A,......
1B等待lockerB以及2B,......
我想实现,当1A获得lockerA时,1B将停止等待lockerB。
我的非成功尝试:
public void Process10People()
{
for (var i = 1; i <= 10; i++)
{
new Thread(Enter).Start(i);
}
}
private void Enter(object id)
{
Console.WriteLine(id + ". wants to enter");
new Thread(() =>
{
lock (lockerA)
{
Console.WriteLine(id + ". is in!");
Thread.Sleep(1000);
Console.WriteLine(id + ". is done");
}
}).Start();
new Thread(() =>
{
lock (lockerB)
{
Console.WriteLine(id + ". is in!");
Thread.Sleep(1000);
Console.WriteLine(id + ". is done");
}
}).Start();
}
但这是错误的,因为1A没有任何选择告诉1B停止等待。我怎么能达到这个目的呢?
答案 0 :(得分:1)
为了向学生展示信号量实现的复杂程度,您可以向他们展示源代码:https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/threading/SemaphoreSlim.cs
或者,您可以考虑不同的设计 例如:有2个线程从队列中读取 - 这不使用信号量。
另一种选择是拥有10个线程,而不是 A 和 B 线程。 而是在循环中使用锁定检查并增加计数器。像这样:
public void Process10People()
{
for (var i = 1; i <= 10; i++)
{
new Thread(Enter).Start(i);
}
}
private void Enter(object id)
{
Console.WriteLine(id + ". wants to enter");
while (true)
{
lock(lockObject)
{
if (this.threadCount < MaxThreadsAllowed) // MaxThreadsAllowed = 2 in your case
{
this.threadCount++;
break;
}
}
// Thread.Sleep(100); // Add a sleep if you'd like
}
Console.WriteLine(id + ". is in!");
Thread.Sleep(1000);
Console.WriteLine(id + ". is done");
lock(lockObject)
{
this.threadCount --;
}
}