C# 重新获取锁(Wait(object,TimeSpan))意味着什么?
我一直在阅读文档,所以我很难理解重新获取锁意味着什么。文件规定: 返回 布尔值 如果在指定时间之前重新获取锁,则为true 逝去;如果在指定时间后重新获取锁,则为false 逝去。在重新获取锁之前,该方法不会返回 我举了一个小例子,想知道是否有人可以用我下面的例子来解释。在哪里重新获取锁(如果有),由哪个线程重新获取C# 重新获取锁(Wait(object,TimeSpan))意味着什么?,c#,multithreading,locking,C#,Multithreading,Locking,我一直在阅读文档,所以我很难理解重新获取锁意味着什么。文件规定: 返回 布尔值 如果在指定时间之前重新获取锁,则为true 逝去;如果在指定时间后重新获取锁,则为false 逝去。在重新获取锁之前,该方法不会返回 我举了一个小例子,想知道是否有人可以用我下面的例子来解释。在哪里重新获取锁(如果有),由哪个线程重新获取 class Program { static readonly object _lock = new object(); sta
class Program
{
static readonly object _lock = new object();
static int x = 0;
static void Main(string[] args)
{
new Thread(Write).Start();
new Thread(Read).Start();
}
static void Read()
{
lock (_lock)
{
while (x != 10)
if (!Monitor.Wait(_lock, 5000))
Console.WriteLine("Timeout!");
Console.WriteLine($"{x} is 10!");
}
}
static void Write()
{
while (x < 10)
{
x++;
Thread.Sleep(1000);
Console.WriteLine(x);
}
lock (_lock)
{
Monitor.Pulse(_lock);
}
}
}
类程序
{
静态只读对象_lock=新对象();
静态int x=0;
静态void Main(字符串[]参数)
{
新线程(Write.Start();
新线程(读取).Start();
}
静态void Read()
{
锁
{
而(x!=10)
如果(!监视器。等待(_lock,5000))
控制台。WriteLine(“超时!”);
WriteLine($“{x}是10!”);
}
}
静态void Write()
{
而(x<10)
{
x++;
睡眠(1000);
控制台写入线(x);
}
锁
{
监视器脉冲(锁定);
}
}
}
一般来说,如果有人能提供一个例子,说明什么时候
等待(Object,Timespan
将返回true,false,并且根本不返回,我将给您一个成功的答案。谢谢!文档的哪一部分让您感到困惑?它没有确切说明等待
何时返回true或false吗?根本不返回意味着您有一个死锁。在您的代码中,您正在锁定,然后等待我的锁隐藏锁定的代码。这毫无意义,因为你是锁定它的人想象你有10个线程:1个进料器和9个进餐器。进料器的任务是将物品排队,每个进餐器的任务是将物品出列并吃掉。现在想象一个进餐器准备吃掉一个物品,因此它锁定了队列。它进行检查,没有东西可以吃它应该怎么做?它可以释放它,然后静静地等待,直到轮到它再次出现,或者它可以调用wait
并释放队列,以便送餐者可以锁定它并放入一些东西。当送餐者将一个项目放入队列时,它将调用pulse,这将最终通知等待的食客。在经过临时时间后,或者脉冲消失nt,eater将再次检查队列,瞧,它有一个项目,它将退出队列并吃掉它。因此,基本上这是一种多线程共享资源的机制,根据资源的状态,暂时锁定或释放资源,然后再次锁定。协作!!需要记住的一点非常重要的一点是,得到rel的不是线程放松和锁定。这是资源。想想像人一样的线程和像人们使用的项目一样的资源。不,你自己没有死锁,因为不管谁先锁定\u lock
,它最终都会释放它。然后下一个线程可以锁定它。如果一个线程锁定t1
就会发生死锁ode>lock1当它拥有锁时,它想要锁定另一个线程,比如lock2
,它被另一个线程t2
锁定,并且它也在等待lock1
上的锁。然后会发生死锁。你先放手!不,你先!不,你先!