Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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#_.net_Thread Safety_Locking - Fatal编程技术网

锁定属性的访问器是确保C#中线程安全的正确/最有效的方法吗?

锁定属性的访问器是确保C#中线程安全的正确/最有效的方法吗?,c#,.net,thread-safety,locking,C#,.net,Thread Safety,Locking,我创建了一个包含两个线程的类。这些线程共享三个列表和几个布尔值。一个线程只读取这些字段,另一个线程读取和写入 为了使布尔线程安全,我为所有布尔线程创建了私有属性,并锁定了它们的get和set(使用专门为锁定而创建的对象)。对于列表,我使用锁定的get创建了属性,该get通过List.ToArray()返回数组,然后创建了锁定的Add方法,用于向列表添加新项(将列表本身用作锁定对象) 我的问题是:创建所有这些属性为我的类添加了大量额外的代码,而在一个单线程类中,这些代码只是私有字段——如此之多以至

我创建了一个包含两个线程的类。这些线程共享三个列表和几个布尔值。一个线程只读取这些字段,另一个线程读取和写入

为了使布尔线程安全,我为所有布尔线程创建了私有属性,并锁定了它们的get和set(使用专门为锁定而创建的对象)。对于列表,我使用锁定的get创建了属性,该get通过List.ToArray()返回数组,然后创建了锁定的Add方法,用于向列表添加新项(将列表本身用作锁定对象)

我的问题是:创建所有这些属性为我的类添加了大量额外的代码,而在一个单线程类中,这些代码只是私有字段——如此之多以至于仅仅实现第二个线程就有如此之多的开销似乎有点傻。这是必要的,还是有更好的方法

(我还刚刚阅读了另一个stackoverflow页面,该页面建议锁定Get和sets实际上不是线程安全的,因为它们只锁定属性并向调用者提供对字段的未锁定引用。但这对值类型不是真的,不是吗?我的列表属性返回数组,而不是对列表字段的引用s、 )

编辑:正如我在评论中所说的,这个类用于建立ssh连接。这个类的大部分内容都涉及到与我所连接的特定linux机器相关的一些内容的自动化。线程部分只是用于向shell发送命令和读取输出

在下面的示例中,“Input”和“Output”指的是锁定的属性,这些属性返回由_Input和_Output列表的ToArray()方法生成的数组

ShellStream.Open();
while(!StopThread)
{
     if (WaitForPrompt)
     {
          if (inputIndex > Input.Length)
          {
              ShellStream.WriteLine(Input[inputIndex]);
              inputIndex++;

              output = ShellStream.WaitForPrompt();
              AddOutput(output);
          }
      }
      else
      {
          if (inputIndex > Input.Length)
          {
              ShellStream.WriteLine(Input[inputIndex]);
              inputIndex++;
          }

          output = ShellStream.Read();

          if (out != null)
              AddOutput(output);
      }
}
ShellStream.Close();

我宁愿锁定代码访问字段,而不是锁定字段本身,但这取决于您需要什么。为什么不发布一些代码?是的,如果没有更多的上下文,这很难回答。线程是否在问题类的内部?客户端代码对返回的数据做了什么?如果不同属性的值与每个ot相关她(否则他们为什么会在同一个班上)如果对属性的操作组合不安全,那么仅仅使属性单独线程安全是没有意义的;例如,如果您决定对其中一个列表执行某项操作,因为其中一个布尔值的值,那么当您获得该列表时,该布尔值可能已经更改。好的,我可以理解为什么上下文在本例中是有用的。因此e类基本上是一个到特定类型linux box的ssh连接,它自动化了一系列需要跳转以建立连接的环。然而,实际的线程部分只是向ssh外壳发送命令并读取输出。我将编辑我的原始问题,以包含一些伪代码。在本文中在特定情况下,在一个循环和下一个循环之间更改布尔值不会对输出产生任何影响。如果我决定开始等待提示,我会在向输入列表添加更多命令之前更改该布尔值。实际上,我甚至没有考虑过属性密切相关的情况彼此迟到,只是因为我的代码不是那样工作的。不过,这是我需要记住的。