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将等待直到锁定被释放.从而防止代码块的并发执行,从而保护该代码使用的任何资源同时被访问.
注意:如果系统的其他部分应该围绕相同的资源进行序列化,那么它们都必须尝试锁定相同的共享锁定器对象.