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
的引用。