C# WiteOne學(xué)習(xí)筆記
具體的需求是 在某一時(shí)間點(diǎn),只有N個(gè)線(xiàn)程在并發(fā)執(zhí)行,如果有多余的線(xiàn)程,則排隊(duì)等候~ 還真是費(fèi)盡心思啊~最終還是被我攻克了,下面我就來(lái)說(shuō)說(shuō)具體的實(shí)現(xiàn) :
C#提供了Mutex與Interlocked這兩個(gè)與線(xiàn)程相關(guān)的類(lèi),都在Threading命名空間下! Mutex中提供了WiteOne,ReleaseMutex 兩個(gè)實(shí)例方法:C# WiteOne的作用是"阻塞當(dāng)前線(xiàn)程,提供對(duì)該線(xiàn)程的原子操作"也就是說(shuō)當(dāng)一個(gè)線(xiàn)程遇到C# WiteOne的時(shí)候,如果在WiteOne里面沒(méi)有線(xiàn)程在操作,則此線(xiàn)程進(jìn)去操作而里面有線(xiàn)程的時(shí)候,所有到此的線(xiàn)程均需要排隊(duì)等候里面的線(xiàn)程執(zhí)行完畢而控制這樣操作的結(jié)束標(biāo)記就是使用ReleaseMutex 方法!
就好比C# WiteOne是一把鎖一樣~而ReleaseMutex 就是一把鑰匙當(dāng)10個(gè)人都看到這個(gè)門(mén)的時(shí)候,***個(gè)到達(dá)門(mén)口的人會(huì)看到屋子里沒(méi)有人,則他進(jìn)去,同時(shí)會(huì)把門(mén)鎖上后面的人自然要在門(mén)口等候,當(dāng)此人在屋子里執(zhí)行完任務(wù)后他會(huì)用鑰匙把門(mén)打開(kāi)! 出去后把鎖交給門(mén)口排隊(duì)的第二位同志,第二位同志再做同樣的操作如果***位同志執(zhí)行完任務(wù)以后不把使用權(quán)交給第二個(gè)人的話(huà),而直接退出那么屋子自然就空了下來(lái),而門(mén)還是鎖的~不必?fù)?dān)心~門(mén)會(huì)自動(dòng)打開(kāi),只要是前一個(gè)人已經(jīng)不在屋子里即可~
然后再來(lái)說(shuō)說(shuō)這個(gè)Interlocked,官方說(shuō)明是"對(duì)一個(gè)變量進(jìn)行原子操作進(jìn)行遞增或者遞減然后保存" 原子操作的概念就是,有且只有一個(gè)線(xiàn)程在對(duì)此變量進(jìn)行操作~不準(zhǔn)其他線(xiàn)程干預(yù)的操作 當(dāng)對(duì)一個(gè)變量進(jìn)行原子操作的時(shí)候,此變量就會(huì)加鎖,而其他線(xiàn)程是無(wú)法訪(fǎng)問(wèn)的,只能掛起等候此變量解鎖 我感覺(jué)實(shí)際上使用的也就是Mutex來(lái)實(shí)現(xiàn)的
- public class MutexTest{
 - private static int poolFlag = 0 ;//標(biāo)記
 - private const int amountThread = 10 ;//線(xiàn)程總量
 - private const int maxThread = 3 ;//可執(zhí)行線(xiàn)程***數(shù)量
 - private static Mutex muxConsole = new Mutex() ;
 - public static void Main(){
 - for ( int i = 0 ;i <amountThread ;i ++ ){
 - // 創(chuàng)建指定數(shù)量的線(xiàn)程
 - // 是線(xiàn)程調(diào)用Run方法
 - // 啟動(dòng)線(xiàn)程
 - Thread trd = new Thread( new ThreadStart( Run ) ) ;
 - trd.Name = "線(xiàn)程" + i ;
 - trd.Start() ;
 - }
 - }
 - public static void Run()
 - muxConsole.WaitOne(); //阻塞隊(duì)列
 - Interlocked.Increment(ref poolFlag) ;//標(biāo)記+1
 - if (poolFlag != maxThread) //判斷是否等于上限
 - muxConsole.ReleaseMutex(); //如果此線(xiàn)程達(dá)不到可執(zhí)行線(xiàn)程上限,則繼續(xù)開(kāi)通,讓后面的線(xiàn)程進(jìn)來(lái)
 - Console.WriteLine( "{0} 正在運(yùn)行...... ", Thread.CurrentThread.Name ) ;
 - Thread.Sleep( 5000 ); //模擬執(zhí)行
 - Console.WriteLine( "{0} 已經(jīng)中止...... ", Thread.CurrentThread.Name ) ;
 - //標(biāo)記-1
 - Interlocked.Decrement(ref poolFlag) ;
 - }
 - }
 
以上介紹C# WiteOne
【編輯推薦】















 
 
 
 
 
 
 