多執行緒程式設計中的主介面安全處理

2021-04-19 10:02:07 字數 1608 閱讀 2544

現在,隨著多核心cpu的流行,很多開發人員,不管自己的程式是否適合用多執行緒,都會使用多執行緒程式設計,通常就是乙個主介面執行緒加n個工作執行緒,而且,常常用單執行緒程式設計的思維來操作主介面,將某些介面物件,例如clist,傳到工作執行緒中去,讓工作執行緒直接操作介面物件,大多數情況下,還可以執行的挺好,沒問題,但是真的沒問題嗎?哈,問題大了。例如

unit myworkthread(lpvoid pparam)

return 0;

}這樣的**多的不得了,而且,在很多時候,它會正常工作的,但是,它不安全,為什麼呢?很多書籍,包括windows核心程式設計,[當然unix中書籍裡講到主介面的就更少了],都沒有提及,主介面的操作其實是個帶鎖的操作,也就是作業系統將強制保證,同一時間乙個程序內最多只有乙個介面操作,例如你的訊息響應函式就是乙個介面操作,不管你的電腦有幾個cpu核心,不管你的程序有多少個工作執行緒,乙個介面同一時間只能有乙個操作,其他操作將被阻塞,直到前一操作完成。 上面這樣的**,違反了 工作執行緒不直接操作介面物件 的規則,是很危險的,**量一大,用到具體的程式中,很容易導致死鎖定,例如,在網路程式中,假如採用這樣的**,當連線斷開的時候,主介面收到訊息,要斷開連線,並等待工作執行緒退出,而工作執行緒正等待修改主介面物件,而主介面物件的操作,由於正在執行斷開訊息的響應,在等待工作執行緒結束,這樣就發生了死鎖,這個教訓我是在開發ftpanywhere客戶端軟體的時候,經歷了上百次的模擬才發現問題的根本並解決的,不過你的運氣比較好,因為前面已經有我給你鋪了路,你可以少走很多歪路了。。。。。。

這種方法不行,於是,有人改進了,採用傳送訊息的方法,我見得太多了,說實話,從看見的第一眼起,我就覺得,用這個**的人可能對多執行緒和物件安全根本沒概念.....

afxgetmainwnd( )->postmessage(.....)

它將(const char *)str作為lparam引數傳遞過去了,汗,大汗啊,cstring物件是執行緒安全嗎?準確的說,cstring類是執行緒安全,但是它的具體物件,則不是執行緒安全,在跨執行緒的呼叫中,必須被同步保護,如果在主介面響應訊息前,str中的緩衝被重新分配了,怎麼辦?內容修改了,怎麼辦?也許,你100次執行前99次都成功了,你能保證第100次也能成功?其實,稍微用點心思,就可以發現問題了,兩個執行緒中的cstring,沒有任何同步,出問題是正常,不出問題,那才是見鬼了

既然直接操作介面物件不行,用訊息傳遞也不理想,那麼如何解決呢?其實很簡單,

全域性 緩衝->一般需要你自己編寫乙個類,然後用carray或者vector等定義為乙個陣列,用來緩衝各類訊息

鎖->這是針對全域性緩衝的,多執行緒操作中,對這個訊息緩衝必須加鎖

訊息對映->定義在全域性緩衝中加了需要操作的介面資料後,傳送什麼訊息,例如 wm_user+1

乙個簡單點的資料定義

class mymsgclass

當工作執行緒有資料需要顯示,

加鎖,mymsgclass然後放到全域性緩衝

解鎖並給主介面乙個訊息 afxgetmainwnd( )->postmessage(...)

主介面接到訊息後

主介面會呼叫訊息響應函式,該函式執行

加鎖從全域性緩衝讀資料,並刪除緩衝中指定資料mymsgclass

解鎖然後根據mymsgclass中的資訊,主介面負責寫資料到具體的介面物件

danscort#nbip.net   #請換成@

多執行緒程式設計 執行緒安全的鍊錶

接下來寫乙個執行緒安全的鍊錶 雙鏈表中每個節點都有乙個指標指向列表中下乙個節點,還有乙個指標指向前乙個節點。其中不變數就是節點a中指向 下乙個 節點b的指標,還有前向指標。為了從列表中刪除乙個節點,其兩邊節點的指標都需要更新。當其中一邊更新完成時,不變數就被破壞了,直到另一邊也完成更新 在兩邊都完成...

多執行緒技術中的面對介面程式設計思想

多執行緒的第二種實現方法,實現乙個介面,runnable 討論關於多執行緒技術內部實現的技術 我們知道,在thread的start方法中呼叫了run方法,如果建立一條執行緒,而不指定任務,那麼這條執行緒是沒有任務的 我們可以這樣實現 class thread public void run publ...

(多執行緒)多執行緒的併發安全

多執行緒併發操作同乙個資源 同步鎖 多執行緒操作的鎖必須唯一 必須搞清楚 哪些 需要同步?那些在操作共享資源的 只要包含非讀的操作,或者根據共享資源進行條件判斷的,就需要同步!同步 塊解決 package com.gc.thread 多執行緒操作共享資源 併發 執行緒安全問題 同步 鎖 相對而言效能...