锁定多个线程中的变量

Sim*_*One 7 c# variables multithreading 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;
     }
}
Run Code Online (Sandbox Code Playgroud)

如果someMethod()且MethodA()可以在单独的线程中处于活动状态,则MethodA()可以将if语句评估为true; 但在它设置之前myVar = 0,someMethod()设置myVar = 0为不正确设置myVar为0 MethodA()!!

基本上,我如何锁定myVar:

  • 我可以lock{}对myVar"财产(设置,获取)
  • 我需要使用Interlock(Interlock虽然我没有经验)?

aqw*_*ert 17

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

private readonly object _locker = new object();
Run Code Online (Sandbox Code Playgroud)

然后在你的属性get/set方法中,锁定它:

get { lock (_locker) { return this.myVar; } }
set { lock (_locker) { this.myVar = value; } }
Run Code Online (Sandbox Code Playgroud)

确保您的方法也使用锁:

public void MethodA()
{
    lock(_locker)
    {
        if(myVar == 1)
          myVar = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)


Dus*_*Lau 2

我就是这样做的。

    static readonly object _myVar_Lock = new object();
    private int _myVar = 0;

    public int myVar
    {
        get { lock (_myVar_Lock) { return this._myVar; } }
        set { lock (_myVar_Lock) { this._myVar = value; } }
    }
Run Code Online (Sandbox Code Playgroud)