worker執行緒操作介面引起的死鎖

2021-05-22 15:46:01 字數 690 閱讀 7882

一般來說涉及介面操作的工作都有ui執行緒完成,但是在多執行緒程式中worker子執行緒進行簡單的介面操作也是常見的事情!worker執行緒和主線程(ui執行緒)同時更新介面時容易造成訊息迴圈阻塞,引起死鎖!引起訊息迴圈阻塞的原因是worker執行緒沒有自己的訊息迴圈,其和主線程公用同一執行緒!引起死鎖的原因是當子執行緒更新介面時需要傳送訊息向主線程訊息佇列,如果主線程沒有wait或者sleep等該訊息可以正常處理,但是如果主線程自身剛好也在更新相同的介面,這時子執行緒會等待主線程處理完更新介面訊息才能得到響應!而主線程也會發現有執行緒正在更新這個介面,需要等待該執行緒處理完才繼續自己的處理!哦,相互等待出現!

在多執行緒中,為了保持較好的互動性,一般遵循:

1、在主線程中最好不要用waitforsingleobject、waitformultipleobjects等阻塞訊息迴圈的函式,否則介面會出現無響應現象!

2、一般情況下worker執行緒只處理後台工作,不要涉及介面操作(介面操作涉及太多的訊息),否則主、子執行緒容易相互鎖死!

3、對於子執行緒操作介面較多的情況,可以建立ui執行緒,建立自己訊息迴圈!

工作中遇到了這種情況:worker子執行緒和主線程會更新相同的介面,子執行緒更新的同時主線程更新開始!為了正確更新和防止死鎖,主線程必須在等待子執行緒更新完後進行自己的更新,同時保持繼續響應後繼訊息!常用方法是採取relay措施,延遲處理主線程更新,繼續其他訊息的處理!

relay處理函式如下:

執行緒池中的worker類(未完)

還沒認真看,先記下來這是乙個要看的點。執行緒池中的每乙個執行緒都被封裝成乙個worker物件,threadpool維護的是一組worker物件。繼承aqs,並實現了runnable介面 private final class worker extends abstractqueuedsynchron...

WPF 多執行緒 子執行緒操作介面主線程的元素

1 在 中開啟乙個子執行緒 thread cabservice new thread new threadstart datareceiver cabservice.start 每隔2s 產生乙個資料 public void datareceiver thread.sleep 2000 2 定義 和...

NOLOGGING操作引起的壞塊

nologging操作引起的壞塊 ora 01578和ora 26040 簡介 如果只是錯誤ora 01578,而沒有伴隨ora 26040,那麼這個壞塊是由其它的原因引起的壞塊,可以嘗試使用rman的bmr block media recovery 修復。例如 sql select from te...