程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 多線程的同步原來應該這麼用

多線程的同步原來應該這麼用

編輯:C#入門知識

 

 

用單線程的思維去寫多線程,真是頭痛呀

 

C#中多線程很方便,但是遇到復雜點的任務,同步成了大問題,google到一大堆的方法:

 

lock

 

monitor

 

信號量AutoResetEvent和ManualResetEvent

 

mutex

 

都試過了,可是卻總是同步不了,總會有線程在競爭,單線測試沒任何問題,多線是的問題總是莫名其妙

 

VS的調試器在多線程下調試幾乎能讓人崩潰

 

後來冷靜下來,終於想明白是怎麼回事了:

 

要轉變思路,多線程中的代碼始終處於競爭狀態,也就是CPU在不斷輪詢,其實CPU始終如此,只不過多線更明顯而已

 

想要讓代碼按順序執行,可以利用一個輔助線程,不斷查詢多線程的狀態

 

在需要的時候可以利用讓ManualResetEvent線程waitone(),輔助線程查詢到所有線程狀態均為

WaitSleepJoin時,就可以去執行你需要的代碼,這樣就能完成同步

 

以下為ThreadState定義的枚舉常數

 

成員名稱

    

Aborted

線程處於Stopped狀態中

AbortRequested

已對線程調用了Thread.Abort方法,但線程尚未收到試圖終止它的掛起的System.Threading. ThreadAbortException

Background

線程正作為後台線程執行(相對於前台線程而言)。此狀態可以通過設置Thread.IsBackground屬性來控制

Running

線程已啟動,它未被阻塞,並且沒有掛起的ThreadAbortException

Stopped

線程已停止

StopRequested

正在請求線程停止。這僅用於內部

Suspended

線程已掛起

SuspendRequested

正在請求線程掛起

Unstarted

尚未對線程調用Thread.Start方法

WaitSleepJoin

由於調用WaitSleepJoin,線程已被阻止

 

摘自 rztyfx的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved