Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有些东西管用,而我不';我不明白为什么:将静态字段(信号量)传递给构造函数_C#_Multithreading - Fatal编程技术网

C# 有些东西管用,而我不';我不明白为什么:将静态字段(信号量)传递给构造函数

C# 有些东西管用,而我不';我不明白为什么:将静态字段(信号量)传递给构造函数,c#,multithreading,C#,Multithreading,这是一个有点愚蠢的问题,但问题来了 我正在编程一个lightswitch(组信号灯)。它通过将静态信号量传递给lightswitch构造函数来工作。当线程调用lightswitch上的acquire方法时,它获取信号量。比如说,我有四个线程,两个获取光开关,两个获取信号量。第一个lightswitch线程获取lightswitch,从而获取信号量。这将阻止尝试获取信号量的两个线程,但是获取lightswitch的另一个线程可以通过。试图获取信号量的两个线程被阻塞,直到lightswitch中的最

这是一个有点愚蠢的问题,但问题来了

我正在编程一个lightswitch(组信号灯)。它通过将静态信号量传递给lightswitch构造函数来工作。当线程调用lightswitch上的acquire方法时,它获取信号量。比如说,我有四个线程,两个获取光开关,两个获取信号量。第一个lightswitch线程获取lightswitch,从而获取信号量。这将阻止尝试获取信号量的两个线程,但是获取lightswitch的另一个线程可以通过。试图获取信号量的两个线程被阻塞,直到lightswitch中的最后一个线程完成

下面是一些代码来演示这一点:

使用静态信号量测试类,声明lightswitch

class TestLightSwitch
    {

        private static Utilities.LightSwitch ls;
        private static Utilities.Semaphore sem = new Utilities.Semaphore();

        static void Main(string[] args)
        {

            sem.Release();

            ls = new SeansConcurrencyUtilities.LightSwitch(sem);
Lightswitch具有信号量的副本:

 public class LightSwitch
    {

        private readonly Utilities.Semaphore sem;

        public LightSwitch(Semaphore s)
        {

            sem = s;
我不明白的是为什么它会起作用。为什么线程a进入lightswitch,获取lightswitch的信号量副本,这会影响原始信号量,所以当线程b获取原始信号量时,它会被阻止?这好像是通过参考或什么

为什么线程a进入lightswitch,获取lightswitch的信号量副本,这会影响原始信号量,所以当线程b获取原始信号量时,它会被阻止?这好像是通过参考或什么

由于是引用类型(类),而不是值类型(结构),因此将
信号量
对象引用的副本传递给LightSwitch构造函数。对象本身永远不会被复制

Lightswitch具有信号量的副本:

 public class LightSwitch
    {

        private readonly Utilities.Semaphore sem;

        public LightSwitch(Semaphore s)
        {

            sem = s;
如下所示,
LightSwitch.sem
TestLightSwitch.sem
字段都指向相同的信号量

为什么线程a进入lightswitch,获取lightswitch的信号量副本,这会影响原始信号量,所以当线程b获取原始信号量时,它会被阻止?这好像是通过参考或什么

由于是引用类型(类),而不是值类型(结构),因此将
信号量
对象引用的副本传递给LightSwitch构造函数。对象本身永远不会被复制

Lightswitch具有信号量的副本:

 public class LightSwitch
    {

        private readonly Utilities.Semaphore sem;

        public LightSwitch(Semaphore s)
        {

            sem = s;
如下所示,
LightSwitch.sem
TestLightSwitch.sem
字段都指向相同的信号量

为什么线程a进入lightswitch,获取lightswitch的信号量副本,这会影响原始信号量,所以当线程b获取原始信号量时,它会被阻止?这好像是通过参考或什么

由于是引用类型(类),而不是值类型(结构),因此将
信号量
对象引用的副本传递给LightSwitch构造函数。对象本身永远不会被复制

Lightswitch具有信号量的副本:

 public class LightSwitch
    {

        private readonly Utilities.Semaphore sem;

        public LightSwitch(Semaphore s)
        {

            sem = s;
如下所示,
LightSwitch.sem
TestLightSwitch.sem
字段都指向相同的信号量

为什么线程a进入lightswitch,获取lightswitch的信号量副本,这会影响原始信号量,所以当线程b获取原始信号量时,它会被阻止?这好像是通过参考或什么

由于是引用类型(类),而不是值类型(结构),因此将
信号量
对象引用的副本传递给LightSwitch构造函数。对象本身永远不会被复制

Lightswitch具有信号量的副本:

 public class LightSwitch
    {

        private readonly Utilities.Semaphore sem;

        public LightSwitch(Semaphore s)
        {

            sem = s;

如下所示,
LightSwitch.sem
TestLightSwitch.sem
字段都指向相同的信号量

默认情况下,所有参数都按值传递。这与类型(值或引用)无关。但有一点不同,引用类型将复制其引用,而不是复制数据。由于代码中没有使用
ref
修饰符,因此您的回答在技术上是不正确的,即使您描述的行为可能是正确的。@oleksii“按引用传递”和“按值传递”的定义往往有点松散。“它是通过引用传递的”,我的意思是对实际的
信号量
对象的引用被传递到ctor,这样
LightSwitch
TestLightSwitch
将引用相同的对象,这在技术上是正确的。简言之,我使用的定义与此类似:@dcastro:除非使用oleksii的定义,否则很难清楚地表达C#中4种可能的传球场景。1) 按值引用类型,2)按引用引用类型,3)按值引用类型,4)按引用引用引用类型。如果(1)、(2)和(4)都只是“按引用传递”,您如何区分它们?如果你把对象是什么(value或ref类型)与它的传递方式(通过值或引用)分开,就会清楚得多。我已经编辑了我的答案,现在应该更清楚了。默认情况下,所有参数都是按值传递的。这与类型(值或引用)无关。但有一点不同,引用类型将复制其引用,而不是复制数据。由于代码中没有使用
ref
修饰符,因此您的回答在技术上是不正确的,即使您描述的行为可能是正确的。@oleksii“按引用传递”和“按值传递”的定义往往有点松散。“它是通过引用传递的”,我的意思是对实际的
信号量
对象的引用被传递到ctor,这样
LightSwitch
TestLightSwitch
将引用相同的对象,这在技术上是正确的。简言之,我使用的定义与此类似:@dcastro:除非使用oleksii的定义,否则很难清楚地解释