📜  C# – 锁定线程(1)

📅  最后修改于: 2023-12-03 14:39:44.752000             🧑  作者: Mango

C# – 锁定线程

在并发编程中,锁定线程是很重要的一部分。锁定线程可以保证代码的原子性和避免多线程访问共享资源时的冲突。C# 提供了多种锁定线程的方法:锁定(lock)、互斥锁(Mutex)、信号锁(Semaphore)等。

锁定(lock)

使用 lock 语句可以很方便地锁定线程。例如:

private readonly object obj = new object();

public void Sum()
{
    lock (obj)
    {
        // 对共享资源操作的代码
    }
}

lock 中传入一个对象,该对象会用于线程之间的同步。在 lock 语句块执行期间,该对象会被锁定,其他线程不能使用该对象进入同步块,直到该 lock 语句块执行完毕并释放锁定。这样可以确保代码的原子性。

互斥锁(Mutex)

互斥锁是一种较为高级的锁定机制,它可以在多线程环境下确保多个线程对共享资源的互斥访问。C# 中使用 Mutex 类来实现互斥锁。例如:

private readonly Mutex mutex = new Mutex();

public void Sum()
{
    mutex.WaitOne();
    try
    {
        // 对共享资源操作的代码
    }
    finally
    {
        mutex.ReleaseMutex();
    }
}

在上面的例子中,调用 WaitOne() 方法可以请求获得互斥锁,如果该互斥锁已被其他线程占用,则当前线程会被阻塞。在使用完毕之后,调用 ReleaseMutex() 方法来释放互斥锁。需要注意的是,WaitOne()ReleaseMutex() 方法之间的代码应该是通过互斥锁保护的。

信号锁(Semaphore)

信号锁是一种控制线程数量的机制,它可以控制同一时间内能够访问某个共享资源的线程数量。C# 中使用 Semaphore 类来实现信号锁。例如:

private readonly Semaphore semaphore = new Semaphore(initialCount: 1, maximumCount: 1);

public void Sum()
{
    semaphore.WaitOne();
    try
    {
        // 对共享资源操作的代码
    }
    finally
    {
        semaphore.Release();
    }
}

在上面的例子中,Semaphore 类的初始计数器为 1,每次只能有一个线程进入同步块。在同步块执行完毕之后,需要调用 Release() 方法来释放计数器,使得其他线程能够进入同步块执行相关操作。

总之,在多线程编程中,锁定线程是确保代码正确性和稳定性的关键之一。C# 中提供的锁定机制可以帮助程序员避免多线程访问过程中的冲突,从而确保程序的高效和正确性。