gpt4 book ai didi

c# - lock(){} 是锁定资源,还是锁定一段代码?

转载 作者:可可西里 更新时间:2023-11-01 03:08:08 26 4
gpt4 key购买 nike

我仍然很困惑......当我们写这样的东西时:

Object o = new Object();
var resource = new Dictionary<int , SomeclassReference>();

...并且有两个代码块在访问资源时锁定o...

//Code one
lock(o)
{
// read from resource
}

//Code two
lock(o)
{
// write to resource
}

现在,如果我有两个线程,一个线程执行从 resource 读取的代码,另一个线程执行代码写入它,我想锁定 resource 这样当它正在阅读,作者将不得不等待(反之亦然——如果它正在被写入,读者将不得不等待)。锁构造对我有帮助吗? ...还是我应该使用其他东西?

(出于本示例的目的,我使用了 Dictionary,但可以是任何东西)

有两种情况我特别关心:

  1. 两个线程试图执行同一行代码
  2. 两个线程试图在同一个资源上工作

lock 在这两种情况下都有帮助吗?

最佳答案

大多数其他答案都针对您的代码示例,因此我将尝试在标题中回答您的问题。

锁实际上只是一个 token 。可以说,谁拥有 token 就可以上台。因此,您锁定的对象与您尝试同步的资源没有显式连接。只要所有读者/作者都同意相同的标记,它可以是任何东西。

当尝试锁定对象时(即通过调用对象上的 Monitor.Enter),运行时会检查锁是否已被线程持有。如果是这种情况,试图锁定的线程将被挂起,否则它会获取锁定并继续执行。

当持有锁的线程退出锁范围(即调用 Monitor.Exit)时,锁被释放,任何等待的线程现在都可以获取锁。

关于锁,最后要记住几件事:

  • 锁定所需的时间,但不再锁定。
  • 如果您使用 Monitor.Enter/Exit 而不是 lock 关键字,请确保将对 Exit 的调用放在 finally block ,因此即使在异常情况下也会释放锁。
  • 公开要锁定的对象使得更难了解谁在何时锁定。理想情况下,同步操作应该被封装。

关于c# - lock(){} 是锁定资源,还是锁定一段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/753168/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com