使用foreach的奇怪的lock()行为

Ste*_*eve 4 c# multithreading

所以,这不是我的代码,并且已缩短以显示行为,但它给出了非常意外的结果.

我在一个类和一个锁中有两个函数

object mylock = new object();
List<string> temp = new List<string>();

Func1(string)
{
  lock(mylock)
  {
    temp.Add(string);
  }
}

Func2()
{
  lock(mylock)
  {
    temp.ForEach(p => Func1(p));
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我知道这没有意义,但是当调用Func2时,不应该Func1死锁吗?在我们的例子中,它执行.谢谢.

Dan*_*ant 13

不,它不应该死锁.

Func1如果有人已经持有锁(如Func2)

锁定MSDN文档解释说:

"在保持互斥锁定的同时,在同一个执行线程中执行的代码也可以获取并释放锁定.但是,在锁定被释放之前,阻止其他线程中执行的代码获取锁定."

锁定的目的是防止不同的线程访问相同的资源. Func1Func2同一个线程上.