锁有多深?

Dar*_*ar1 10 .net c# locking thread-safety

我有以下代码:

            locker = new object();
        lock (locker)
        {
            for (int i = 0; i < 3; i++)
                 ver_store[i] = atomic_Poll(power);                
        }
Run Code Online (Sandbox Code Playgroud)

我只是在徘徊,考虑到锁中的函数访问一些全局资源(它们中的一个开放套接字)是否也锁定了对象中的所有全局资源.(我知道访问这些相同变量的任何其他函数必须对它们实现锁定,以使锁定机制有效.我还没有完成锁定它们:))

Pet*_*old 12

lock语句不会"锁定代码"或任何介于大括号之间的资源.

我发现从线程角度理解锁是最好的(毕竟,线程场景就是你需要考虑锁定的时候).

给出您的示例代码

10  locker = new object();
11  lock (locker)
12  {
     ...
15  }
Run Code Online (Sandbox Code Playgroud)

当线程X到达线10时,创建新对象,并且在线11处,在对象上获取锁.线程X继续执行块内的任何代码.

现在,当线程X位于我们块的中间时,线程Y到达第10行.然后,创建一个新对象,并且由于它是由线程Y创建的,因此当前没有锁定此对象.因此,当线程Y达到11时,它将成功获取对象的锁定并继续与线程X同时执行该块.

这是锁被假设要防止的情况.那么该怎么办?使储物柜成为共享对象.

01  static object locker = new object();

    ...

11  lock (locker)
12  {
     ...
15  }
Run Code Online (Sandbox Code Playgroud)

现在,当线程X到达第11行时,它将获取锁并开始执行该块.当线程Y到达第11行时,它将尝试获取与线程X相同的对象的锁定.由于此对象已被锁定,线程Y将等待直到锁定被释放.从而防止代码块的并发执行,从而保护该代码使用的任何资源同时被访问.

注意:如果系统的其他部分应该围绕相同的资源进行序列化,那么它们都必须尝试锁定相同的共享锁定器对象.