Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重新获取锁(Wait(object,TimeSpan))意味着什么?_C#_Multithreading_Locking - Fatal编程技术网

C# 重新获取锁(Wait(object,TimeSpan))意味着什么?

C# 重新获取锁(Wait(object,TimeSpan))意味着什么?,c#,multithreading,locking,C#,Multithreading,Locking,我一直在阅读文档,所以我很难理解重新获取锁意味着什么。文件规定: 返回 布尔值 如果在指定时间之前重新获取锁,则为true 逝去;如果在指定时间后重新获取锁,则为false 逝去。在重新获取锁之前,该方法不会返回 我举了一个小例子,想知道是否有人可以用我下面的例子来解释。在哪里重新获取锁(如果有),由哪个线程重新获取 class Program { static readonly object _lock = new object(); sta

我一直在阅读文档,所以我很难理解重新获取锁意味着什么。文件规定:

返回

布尔值

如果在指定时间之前重新获取锁,则为true 逝去;如果在指定时间后重新获取锁,则为false 逝去。在重新获取锁之前,该方法不会返回

我举了一个小例子,想知道是否有人可以用我下面的例子来解释。在哪里重新获取锁(如果有),由哪个线程重新获取

     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
上的锁。然后会发生死锁。你先放手!不,你先!不,你先!