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