由其他Thread创建的线程的线程同步

时间:2017-01-14 18:00:54

标签: c# multithreading synchronization

我想拥有这个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停止等待。我怎么能达到这个目的呢?

1 个答案:

答案 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 --;
    }
}