C#多线程中如何运用互斥锁Mutex
互斥锁(Mutex)
互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它。
互斥锁可适用于一个共享资源每次只能被一个线程访问的情况
函数:
//创建一个处于未获取状态的互斥锁 PublicMutex(); //如果owned为true,互斥锁的初始状态就是被主线程所获取,否则处于未获取状态 PublicMutex(boolowned);
如果要获取一个互斥锁。应调用互斥锁上的WaitOne()方法,该方法继承于Thread.WaitHandle类
它处于等到状态直至所调用互斥锁可以被获取,因此该方法将组织住主调线程直到指定的互斥锁可用,如果不需要拥有互斥锁,用ReleaseMutex方法释放,从而使互斥锁可以被另外一个线程所获取。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading;
namespaceMyTTCon
{
classshareRes
{
publicstaticintcount=0;
publicstaticMutexmutex=newMutex();
}
classIncThread
{
intnumber;
publicThreadthrd;
publicIncThread(stringname,intn)
{
thrd=newThread(this.run);
number=n;
thrd.Name=name;
thrd.Start();
}
voidrun()
{
Console.WriteLine(thrd.Name+"正在等待themutex");
//申请
shareRes.mutex.WaitOne();
Console.WriteLine(thrd.Name+"申请到themutex");
do
{
Thread.Sleep(1000);
shareRes.count++;
Console.WriteLine("In"+thrd.Name+"ShareRes.countis"+shareRes.count);
number--;
}while(number>0);
Console.WriteLine(thrd.Name+"释放thenmutex");
//释放
shareRes.mutex.ReleaseMutex();
}
}
classDecThread
{
intnumber;
publicThreadthrd;
publicDecThread(stringname,intn)
{
thrd=newThread(this.run);
number=n;
thrd.Name=name;
thrd.Start();
}
voidrun()
{
Console.WriteLine(thrd.Name+"正在等待themutex");
//申请
shareRes.mutex.WaitOne();
Console.WriteLine(thrd.Name+"申请到themutex");
do
{
Thread.Sleep(1000);
shareRes.count--;
Console.WriteLine("In"+thrd.Name+"ShareRes.countis"+shareRes.count);
number--;
}while(number>0);
Console.WriteLine(thrd.Name+"释放thenmutex");
//释放
shareRes.mutex.ReleaseMutex();
}
}
classProgram
{
staticvoidMain(string[]args)
{
IncThreadmthrd1=newIncThread("IncThreadthread",5);
DecThreadmthrd2=newDecThread("DecThreadthread",5);
mthrd1.thrd.Join();
mthrd2.thrd.Join();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。