本文共 5791 字,大约阅读时间需要 19 分钟。
???????????????????????????????????????????????????????????????????????????????????????????????
????? Sleep
?Join
?EndInvoke
????????????????Sleep ?????????CPU?? Join
?EndInvoke
????????????????????CPU???????????????????????
static void Main(){ Thread t = new Thread(Go); Console.WriteLine("Main???????"); t.Start(); t.Join(); // ??Main?? Console.WriteLine("Main????????????");}static void Go(){ Console.WriteLine("?t?????Go???");}
static void Main(){ Console.WriteLine("Main???????"); Thread.CurrentThread.Sleep(3000); // ?????? Console.WriteLine("Main?????????????);}
static void Main(){ Task Task1 = Task.Run(() => { Console.WriteLine("task??????); Thread.Sleep(1000); }); Console.WriteLine(Task1.IsCompleted); Task1.Wait(); // ????????Task1?? Console.WriteLine(Task1.IsCompleted);}
??????????????????????????????????????????????????
lock (this)
? lock (typeof(??))
????? private
??????await
?class ThreadSafe{ private static object _locker = new object(); void Go() { lock (_locker) { // ????????????????????????????? } private object _locker2 = new object(); void GoTo() { lock (_locker2) // ?????????????????????????????????????? }}
lock
? Monitor
??????lock (x)
????
System.Object obj = x;System.Threading.Monitor.Enter(obj);try{ // ????}finally{ System.Threading.Monitor.Exit(obj);}
??????????????????????????????????
class Program{ public static Mutex mutex = new Mutex(); static void Main(string[] args) { for (int i = 0; i < 3; i++) { Thread test = new Thread(MutexMethod); test.Start(); } Console.Read(); } public static void MutexMethod() { Console.WriteLine("{0} ???????", Thread.CurrentThread.Name); mut.WaitOne(); Console.WriteLine("{0} ???????", Thread.CurrentThread.Name); Thread.Sleep(1000); Console.WriteLine("{0} ???????", Thread.CurrentThread.Name); mut.ReleaseMutex(); Console.WriteLine("{0} ???????", Thread.CurrentThread.Name); }}
????????????????????????AutoResetEvent
? ManualResetEvent
????????
AutoResetEvent
???????????????????????? false
?WaitOne
??????????????? true
?
class ThreadSafe{ static AutoResetEvent autoEvent; static void Main() { autoEvent = new AutoResetEvent(false); Console.WriteLine("??????"); Thread t = new Thread(DoWork); t.Start(); Console.WriteLine("???sleep 1??"); Thread.Sleep(1000); Console.WriteLine("????????"); autoEvent.Set(); } static void DoWork() { Console.WriteLine("t????DoWork?????????main?????"); autoEvent.WaitOne(); Console.WriteLine("t??DoWork?????main???????????); }}
ManualResetEvent
???????????Set
?????????????????WaitOne
?????????????????????
class ThreadSafe{ private static ManualResetEvent mre = new ManualResetEvent(false); static void Main() { for (int i = 0; i <= 2; i++) { Thread t = new Thread(ThreadProc); t.Name = "Thread_" + i; t.Start(); } Thread.Sleep(500); Console.WriteLine("??????????????????Set??????"); mre.Set(); Thread.Sleep(500); Console.WriteLine("?ManualResetEvent??????????Wait.One?????????????"); for (int i = 3; i <= 4; i++) { Thread t = new Thread(ThreadProc); t.Name = "Thread_" + i; t.Start(); } Thread.Sleep(500); Console.WriteLine("??Reset???ManualResetEvent????????????Wait.One??????????"); mre.Reset(); Thread t5 = new Thread(ThreadProc); t5.Name = "Thread_5"; t5.Start(); Thread.Sleep(500); Console.WriteLine("??Set?????????"); mre.Set(); } private static void ThreadProc() { string name = Thread.CurrentThread.Name; Console.WriteLine(name + " ?????WaitOne()"); mre.WaitOne(); Console.WriteLine(name + " ??"); }}
Interlocked
??????????????????????????????
public static class InterlockedExample{ private static int _sharedValue = 0; public static void IncrementValue(ref int location) { Interlocked.Add(ref location, 1); } public static void CompareExchange(ref int location, int value, int comparand) { if (Interlocked.CompareExchange(ref location, value, comparand) == comparand) { // ?????????????? } }}
ReaderWriterLock
????????????????????????????
class Program{ public static ReaderWriterLock readerwritelock = new ReaderWriterLock(); static void Main(string[] args) { Thread t1 = new Thread(Write); t1.Start(); Thread t2 = new Thread(Write); t2.Start(); for (int i = 3; i < 6; i++) { Thread t = new Thread(Read); t.Start(i); } Console.Read(); } private static void Write(object i) { Console.WriteLine("???" + i + "????"); readerwritelock.AcquireWriterLock(Timeout.Infinite); Console.WriteLine("???" + i + " ???" + DateTime.Now); Thread.Sleep(1000); Console.WriteLine("???" + i + "?????); readerwritelock.ReleaseWriterLock(); } private static void Read(object i) { Console.WriteLine("???" + i + "????"); readerwritelock.AcquireReaderLock(Timeout.Infinite); Console.WriteLine("???" + i + " ???" + DateTime.Now); Thread.Sleep(1000); Console.WriteLine("???" + i + "?????); readerwritelock.ReleaseReaderLock(); }}
转载地址:http://xurtz.baihongyu.com/