由於子系統中的任務,需要處理的資料量比較大,為了提高系統工作效率,老大要求使用多執行緒來執行任務,而我剛好負責流程控制這一塊,當時真是被多執行緒折騰的死去活來,這個系統其實是有原型可以參考的,而且這個原型系統是久經考驗,穩定性也很高;所以老大給我的時間並不多,我當時也沒意識到難度會如此之大,但原型使用的是單執行緒,很多模組在單執行緒下跑得很歡,一到多執行緒就各種難了。
其實現在想來,使用多執行緒並行處理資料,真心不算個好的決定。
多執行緒適合處理的任務性質多為耗時的等待,或輪詢判斷狀態。而此資料管理系統的瓶頸卻是cpu運算和硬碟資料傳輸速度,後來測試結果也顯示,多執行緒對效能的提公升並不算太明顯。當然這個不是主要原因,如果把系統布在強大的伺服器上,效能提公升還是有的。
更主要的原因是:資料處理任務太不原子化了(額 不知道原子化的反義詞是什麼),執行緒安全程度非常低。詳細說明下就是,任務執行的過程中,和太多其他模組有太多的互動了,而且大量使用了全域性變數(比如處理任務需要的各種引數、配置、執行方案)和靜態變數(資料庫操作類的靜態例項),一旦跑起多執行緒,就各種併發衝突。當時我又沒有很清晰的意識到這個問題,於是到處加鎖,在dal入口加鎖,在任務訪問資料的地方加鎖,在使用dbhelper的靜態物件地方加鎖,搞得這部分異常複雜,而且加太多鎖的後果就是效能進一步的下降,搞得幾乎和單執行緒效率差不多了。
額,說了半天廢話,還沒進入主題,有時間再接著整理(寫)吧。
(待續)
這幾天比較事多,今天有點功夫,接著寫吧,
其實讓執行緒跑起來倒是不難,
thread thread1 = new thread(delegate())
);thread1.start(); 這是匿名方法建立執行緒,當然,也可以先例項化delegate。一樣的。
也可以使用 threadpool.queueuserworkitem(dodeleteinvoke)的方式。
難就難在thread的控制上,一般來說,如果要對執行緒執行的情況進行監控,控制,多使用前者。
比如我需要根據使用者設定,可以隨時對執行緒進行掛起、恢復和銷毀,基本就只能靠前者的方式了。
最開始的時候,我是檢查threadstate
然後使用
suspended和
resume
方法,遇到了很多問題。
//呼叫resume方法可以恢復乙個被延遲的執行緒。如果執行緒沒有被延遲,resume方法就是無效的。
if (thread.threadstate = threadstate.suspended)
引用msdn:
「只在少數幾個除錯方案中涉及執行緒狀態列舉。您的**在任何情況下都不應使用執行緒狀態來同步執行緒的活動。」
「thread
.suspend
和 thread
.resume
方法通常並不是對所有應用程式都有用,並且不應將其與同步機制混淆。 由於 thread
.suspend
和 thread
.resume
不依賴於受控制線程的協作,因此,它們極具侵犯性並且會導致嚴重的應用程式問題,如死鎖(例如,如果掛起的執行緒占有另乙個執行緒需要的資源,就會發生這種情況)。」
thread有個threadstate屬性代表了執行緒的狀態資訊
可以通過這個屬性判斷執行緒當時的狀態,
當乙個thread例項剛建立時,他的threadstate是unstarted;當此執行緒被呼叫start()啟動之後,他的threadstate是 running; 在此執行緒啟動之後,如果想讓他暫停(阻塞),能呼叫thread.sleep()方法,他有兩個過載方法(sleep(int )、sleep(timespan)),只不過是表示時間量的格式不同而已,當在某執行緒內呼叫此函式時,他表示此執行緒將阻塞一段時間(時間是由傳遞給sleep 的毫秒數或timespan決定的,但若引數為0則表示掛起此執行緒以使其他執行緒能夠執行,指定
重要事項
只在幾個除錯方案中涉及執行緒狀態。始終不應在**中使用執行緒狀態來同步執行緒活動。
this._thread.threadstate==threadstate.running 很可能就不是你要的結果,可能執行緒的資源被搶占,現在處於watersleepjoin狀態, 那麼這句話返回的就是false了。
C 高階特性(三)多執行緒
1,鎖 控制多執行緒併發操作時,執行緒安全問題。舉例 static bool done 執行緒是否完成標識 static object locker new object 執行緒鎖 static void main string args static void test 結果 done.threa...
三 多執行緒斷點續傳
conn.setrequestmethod get 獲取檔案總長度,然後建立長度一致的臨時檔案 向伺服器請求部分資料 conn.setrequestproperty range bytes startindex endindex conn.connect if conn.getresponsecod...
三 多執行緒與上廁所
世界上最讓人坐立不安,最知道心急的時候,是拿著手紙捂著肚子而廁所裡有人的時候。現在我們有兩個人,乙個在廁所裡,乙個在廁所外。廁所外的人一直問 你好了沒?while 廁所裡的人沒出來 這個時候就會變成,裡面的人拉的不舒服,外面的人也難受。現在我們把條件放寬一點,假如外面的人不是很急,那麼他還是這麼問的...