C#:是多线程应用程序中线程本地共享静态类中的方法参数

C#:是多线程应用程序中线程本地共享静态类中的方法参数,c#,multithreading,concurrency,monitor,locks,C#,Multithreading,Concurrency,Monitor,Locks,因此,我有一个共享类的单个实例,它执行的操作与读写器问题类似,只是更加轻松,它的设计目的是通过实现一个队列来解决饥饿问题。有两套完全相同的方法,一套用于男性,一套用于女性。这种想法是,如果没有女性,任何数量的男性都可以使用卫生间,同样,如果没有男性,任何数量的女性都可以使用卫生间 鉴于这是一个多线程程序,我想知道参数Node-male对于每个线程是否是唯一的?在试图获得锁的时候,我们首先检查我们是否是队列的头,是否没有女性正在使用浴室,如果这是真的,我们可能会进入关键区域,否则我们等待 我想知道

因此,我有一个共享类的单个实例,它执行的操作与读写器问题类似,只是更加轻松,它的设计目的是通过实现一个队列来解决饥饿问题。有两套完全相同的方法,一套用于男性,一套用于女性。这种想法是,如果没有女性,任何数量的男性都可以使用卫生间,同样,如果没有男性,任何数量的女性都可以使用卫生间

鉴于这是一个多线程程序,我想知道参数
Node-male
对于每个线程是否是唯一的?在试图获得锁的时候,我们首先检查我们是否是队列的头,是否没有女性正在使用浴室,如果这是真的,我们可能会进入关键区域,否则我们等待

我想知道在
监视器.Wait
语句之后,线程是否被重新唤醒,
节点
实例是否是预期的对象,或者它是否可能引用调用该方法且当前卡在
监视器.Wait
的线程之一?如果当前执行的线程是
thread1
,而
male
引用的线程实际上是
thread2
,我不希望线程看到条件
result==male
为真

public void EnterMale(Node male)
    {
        Monitor.Enter(_bathroomLock);
        _bathroomQueue.Enqueue(male);
        Node result;
        _bathroomQueue.TryPeek(out result);
        while (result != male || _numOfFemales > 0)
        {
            Monitor.Wait(_bathroomLock);
            _bathroomQueue.TryPeek(out result);
        }
        _numOfMales++;
        //Remove self from queue
        _bathroomQueue.TryDequeue(out result);
        //Wake up next person in line
        //need to own lock for this or exception gets thrown
        Monitor.PulseAll(_bathroomLock);
        //Enter critical section
        Monitor.Exit(_bathroomLock);

    }

public void LeaveMale()
    {
        _numOfMales--;
        //Wake up next person in line
        //need to own lock for this or exception gets thrown
        lock (_bathroomLock)
            Monitor.PulseAll(_bathroomLock);
    }

不清楚你到底在问什么
male
将是传递给函数的任何内容。我询问是否有两个线程
T1
T2
,这两个线程都调用
EnterMale(this)
其中
this
将是该线程的一个实例。由于它是通过引用传递的,因此序列是否可能发生,例如
EnterMale(T1)=>EnterMale(T2)=>Read_T1(male)==T2
,其中
=>
是“发生在”之前的关系,
Read_T1
是线程
T1
对参数
male
执行的读取操作。表示
T1
的参数引用已被
T2
的引用所取代。不清楚您到底在问什么
male
将是传递给函数的任何内容。我询问是否有两个线程
T1
T2
,这两个线程都调用
EnterMale(this)
其中
this
将是该线程的一个实例。由于它是通过引用传递的,因此序列是否可能发生,例如
EnterMale(T1)=>EnterMale(T2)=>Read_T1(male)==T2
,其中
=>
是“发生在”之前的关系,
Read_T1
是线程
T1
对参数
male
执行的读取操作。表示
T1
的参数引用已替换为
T2
的引用。