c# - 在多个线程中锁定一个变量

标签 c# multithreading variables locking

我是C#新手,想问一下我在MULTI THREADS中是否有这种情况(伪代码):

public class ClassA
{
     ClassB c = new ClassB();
     public void someMethod()
     {
          c.myVar = 1;
          // Some other stuff
          c.myVar = 0;
     }
}

public class ClassB
{
     internal int myVar;

     public void MethodA()
     {
        if(myVar = 1)
              myVar = 0;
     }
}

如果 someMethod()MethodA() 可以在不同的线程中激活,那么 MethodA() 可以评估 if 语句为真;但在它设置 myVar = 0 之前,someMethod() 设置了 myVar = 0 使得设置 myVar 不正确在 MethodA() 中为 0!!

基本上,我如何锁定 myVar:

  • 我可以锁定{} myVar 的属性(设置、获取)
  • 我是否需要使用 Interlock(虽然我还没有使用过 Interlock)?

最佳答案

您应该创建一个允许锁定的私有(private)对象:

private readonly object _locker = new object();

然后在您的属性获取/设置方法中,锁定它:

get { lock (_locker) { return this.myVar; } }
set { lock (_locker) { this.myVar = value; } }

确保您的方法也使用锁:

public void MethodA()
{
    lock(_locker)
    {
        if(myVar == 1)
          myVar = 0;
    }
}

关于c# - 在多个线程中锁定一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4081986/

相关文章:

swift - 核心数据在不同线程中获取和保存

java - 在可运行线程中的文件中写入换行符

php 声称我定义的变量未定义

c# - 类型 T 的动态通用声明

c# - 如果没有适当的括号放置,求和运算无法给出预期结果?

c# - 如何从 Windows 10 IoT 托管临时 802.11 网络

PHP在另一个类中访问类

c# - Silverlight 错误 263 域操作条目 'MyOperation' 必须恰好采用一个参数

c - 没有全局变量的 pthreads 互斥锁,只返回 thread_struct 中的数组

即使使用了 global 关键字,PHP 全局变量在函数内部也是未定义的