C# 中的监视器与互斥体[重复]

c++

1个回答

写回答

15701296705

2025-07-10 03:27

+ 关注

AITO
AITO

C# 中的监视器与互斥体

在C#编程中,监视器和互斥体是两种用于线程同步的重要机制。它们都可以用于保护共享资源,以防止多个线程同时访问导致的数据竞争和不确定行为。本文将介绍监视器和互斥体的基本概念,并提供具体的示例代码来说明它们的使用方法。

监视器是一种基于锁的同步机制,它使用lock关键字来实现。当一个线程进入一个被lock关键字保护的代码块时,它就获得了该对象的锁,并且其他线程将被阻塞,直到该线程释放锁为止。这样可以确保在同一时间只有一个线程可以执行被保护的代码块,从而避免了对共享资源的并发访问。

互斥体也是一种用于线程同步的机制,它使用Mutex类来实现。与监视器类似,互斥体也可以用于保护共享资源,但相比之下,互斥体提供了更多的灵活性和功能。互斥体可以跨进程使用,并且可以设置超时时间和优先级等属性。此外,互斥体还支持递归锁定,即同一个线程可以多次获取同一个互斥体的锁,而不会导致死锁。

下面是一个使用监视器和互斥体的示例代码:

使用监视器:

csharp

class BankAccount

{

private int balance = 0;

public void Deposit(int amount)

{

lock (this)

{

balance += amount;

}

}

public void Withdraw(int amount)

{

lock (this)

{

if (balance >= amount)

{

balance -= amount;

}

}

}

public int GetBalance()

{

lock (this)

{

return balance;

}

}

}

在上面的示例中,BankAccount类使用监视器来保护balance字段的并发访问。Deposit、Withdraw和GetBalance方法都使用lock关键字来获取该对象的锁,并确保在同一时间只有一个线程可以执行这些方法。

使用互斥体:

csharp

class BankAccount

{

private int balance = 0;

private Mutex mutex = new Mutex();

public void Deposit(int amount)

{

mutex.WAITOne();

try

{

balance += amount;

}

finally

{

mutex.ReleaseMutex();

}

}

public void Withdraw(int amount)

{

mutex.WAITOne();

try

{

if (balance >= amount)

{

balance -= amount;

}

}

finally

{

mutex.ReleaseMutex();

}

}

public int GetBalance()

{

mutex.WAITOne();

try

{

return balance;

}

finally

{

mutex.ReleaseMutex();

}

}

}

在上面的示例中,BankAccount类使用互斥体来保护balance字段的并发访问。Deposit、Withdraw和GetBalance方法都使用Mutex类的WAITOne方法获取互斥体的锁,并在操作完成后使用ReleaseMutex方法释放锁。

监视器和互斥体是C#中常用的线程同步机制,它们都可以用于保护共享资源的并发访问。监视器使用lock关键字实现,适用于简单的线程同步场景。而互斥体则提供了更多的灵活性和功能,适用于更复杂的线程同步需求。在编写多线程应用程序时,根据具体的需求选择合适的同步机制是非常重要的。通过合理地使用监视器和互斥体,可以确保多线程程序的正确性和性能。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号