C# 使用Monitor类、lock和Mutex类进行多线程同步
-
在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库中这是很常见的,但是在程序中大部分都是单线程的程序,所以没有加锁的必要,但是在多线程中,为了保持数据的同步,一定要加锁。
-
在Framework中已经为我们提供了三个加锁的机制,分别是Monitor类、lock关键字和Mutex类。
-
Monitor和lock用法差不多,都是锁定数据或是锁定被调用的函数。Mutex多用于锁定多线程间的同步调用。
-
Mutex只能互斥线程间的调用,但是不能互斥本线程的重复调用。运行下面程序,可以看出thread1中waitOne()只对thread2中的waitOne()起到互斥的作用,但是thread1并不受waitOne()的影响,可以调用多次,只是在调用结束后调用相同次数的ReleaseMutex()就可以。
private void thread1Func()
{
for (int count = 0; count < 10; count++)
{
mutex.WaitOne();
TestFunc(“Thread1 have run " + count.ToString() + " times”);
mutex.ReleaseMutex();
}
}
private void thread2Func()
{
for (int count = 0; count < 10; count++)
{