温馨提示×

c# wait 能否与 lock 一起用

c#
小樊
83
2024-11-26 12:22:21
栏目: 编程语言

在C#中,WaitLock可以一起使用,但它们分别属于不同的类:Wait属于System.Threading.Monitor类,而Lock属于System.Threading.Monitor类的一个静态属性。

Monitor.Wait方法用于等待一个对象监视器上的锁被释放。当调用Monitor.Wait方法时,当前线程会释放对象的锁并进入等待状态。当其他线程调用Monitor.PulseMonitor.PulseAll方法时,等待的线程将被唤醒并重新尝试获取对象的锁。

Monitor.Lock是一个静态属性,用于获取一个对象的监视器上的锁。当调用Monitor.Lock方法时,当前线程会获取对象的锁并继续执行。如果锁已被其他线程持有,则当前线程将阻塞,直到锁被释放。

以下是一个使用Monitor.WaitMonitor.Lock的示例:

using System;
using System.Threading;

class Program
{
    private static readonly object _lockObject = new object();

    static void Main()
    {
        Thread thread1 = new Thread(Thread1);
        Thread thread2 = new Thread(Thread2);

        thread1.Start();
        thread2.Start();
    }

    static void Thread1()
    {
        Monitor.Lock(_lockObject);
        Console.WriteLine("Thread1 acquired the lock.");

        // Simulate some work
        Thread.Sleep(1000);

        Monitor.Wait(_lockObject);
        Console.WriteLine("Thread1 released the lock and is waiting.");

        // Simulate some more work
        Thread.Sleep(1000);

        Monitor.Exit(_lockObject);
        Console.WriteLine("Thread1 exited.");
    }

    static void Thread2()
    {
        Monitor.Lock(_lockObject);
        Console.WriteLine("Thread2 acquired the lock.");

        // Simulate some work
        Thread.Sleep(1000);

        Monitor.Pulse(_lockObject);
        Console.WriteLine("Thread2 pulsed the lock.");

        Monitor.Exit(_lockObject);
        Console.WriteLine("Thread2 exited.");
    }
}

在这个示例中,Thread1Thread2都尝试获取同一个对象的锁。Thread1首先获取锁并执行一些工作,然后释放锁并等待。Thread2Thread1释放锁后获取锁并执行一些工作,然后通过Monitor.Pulse唤醒Thread1。最后,两个线程都释放锁并退出。

0