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

时间:2015-04-02 10:10:01

标签: c# .net thread-safety locking

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

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

我的问题是:创建所有这些属性为我的类添加了大量额外的代码,因为在单线程类中,它只是私有字段 - 以至于它只是看起来有些愚蠢#&# 39;为了实现第二个线程,只需要很多开销。有必要,还是有更好的方法呢?

(我还读了另一个stackoverflow页面,它提示锁定获取和设置实际上不是线程安全的,因为它们只锁定属性并为调用者提供对该字段的解锁引用。但是这对于值类型是不正确的,是吗?我的List属性是返回数组,而不是对列表字段的引用。)

编辑:正如我在评论中所说,该课程用于建立ssh连接。大多数课程都关注自动化与我连接的特定linux机器有关的一些东西。螺纹部分仅用于向shell发送命令并读取输出。

在以下示例中"输入"和"输出"引用返回由_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();

0 个答案:

没有答案