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),可以用一个锁将许多项目出队。