何时使用锁定指南

mig*_*uel 17 c# multithreading locking

我想知道开发人员应该遵循何时(以及在何处)放置锁的指导方针.

例如:我理解应锁定此类代码,以避免另一个线程意外更改SomeHeapValue值的可能性.

class Foo
{
  public SomeHeapObject myObject;
  public void DoSummat(object inputValue_)
  {
    myObject.SomeHeapValue = inputValue_;
  }

}
Run Code Online (Sandbox Code Playgroud)

然而,我的问题是,锁定有多深?例如,如果我们有这个代码:

class Foo
{
  public SomeHeapObject myObject;
  public void DoSummat(object inputValue_)
  {
    myObject.SomeHeapValue = GetSomeHeapValue();
  }

}
Run Code Online (Sandbox Code Playgroud)

我们应该锁定DoSummat(...)方法,还是应该锁定GetSomeHeapValue()方法?

在编写多线程代码时,是否有任何指导都要牢记在心?

小智 22

我找到的锁定和线程的最佳指南就是这个页面(这是我在处理锁定和线程时参考的文本):

http://www.albahari.com/threading/

哟想要"锁定和线程安全"这一段,但也读了其余部分,它写得非常好.


小智 3

  • 尽可能少地锁定,但根据需要尽可能多地锁定。

  • 尽可能避免锁定 - 在 .NET 4.0 中,有一些不会导致上下文切换的替代方案。

  • 尽量不要多次锁定。相应地构建您的 API。例如队列。DeQueue - 制作一个替代的 DeQueue(int amount),可以用一个锁将许多项目出队。