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(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。