gpt4 book ai didi

c# - 在递归调用中使用 lock(obj)

转载 作者:IT王子 更新时间:2023-10-29 04:31:49 27 4
gpt4 key购买 nike

根据我的理解,在运行时完成 lock(obj) 的代码块之前不会释放锁(因为当 block 完成时它会调用 Monitor.Exit(obj)。

基于这种理解,我无法理解以下代码行为背后的原因:

private static string obj = "";
private static void RecurseSome(int number)
{
Console.WriteLine(number);
lock (obj)
{
RecurseSome(++number);
}
}

//调用: RecurseSome(0)

//输出: 0 1 2 3......堆栈溢出异常

一定有一些我遗漏的概念。请帮忙。

最佳答案

锁知道哪个线程锁定了它。如果同一个线程再次出现,它只会增加一个计数器而不会阻塞。

因此,在递归中,第二个调用也进入 - 锁在内部增加锁计数器 - 因为它是同一个线程(已经持有锁)。

ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dv_csref/html/656da1a4-707e-4ef6-9c6e-6d13b646af42.htm

或 MSDN:http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

状态:

The lock keyword ensures that one thread does not enter a critical section of code while another thread is in the critical section. If another thread tries to enter a locked code, it will wait, block, until the object is released.

注意线程引用和对“另一个”线程的强调。

关于c# - 在递归调用中使用 lock(obj),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2407462/

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