引起執行緒死鎖的一種情況及解決方法

2021-04-12 13:30:48 字數 643 閱讀 6753

typedef clistclistdata;

class cdatadlg

m_cs.unlock();

}protected:

clistctrl m_ctllistdata;

mutable ccriticalsection m_cs;

}extern cdatadlg datadlg;

class cglobaldata

/*void showdata()

*/protected:

clistdata m_listobj;

}分析:在呼叫cglobal::showdata時會出現死鎖,因為cdatadlg所依附的執行緒在呼叫cdatadlg::inserttolistctrl函式時,碰到m_cs.lock()會被鎖住,而接下來呼叫的函式m_ctllistdata.insertitem其中又會呼叫sendmessage函式,sendmessage是個同步函式,需要函式返回才能執行,而當前執行緒已經被鎖住,所以sendmessage無法執行;而當前程式又因為sendmessage無法返回而無法執行,這就形成了死鎖.

解決方法:在cglobal::showdata中使用postmessage向cdatadlg投遞訊息,這樣做的好處是cdatadlg鎖依附的執行緒可以將訊息序列化,避免死鎖.

執行緒的一種解決死鎖的方式

一 什麼是死鎖?所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由於資源佔用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配...

mysql 死鎖 MySql 死鎖時的一種解決辦法

之前也遇到一次,今天又遇到了這個問題,所以這次必須解決,網上找到這篇文章幫了大忙,方便以後複習。這篇文章的解決辦法對於我的情況是有效的。我的具體情況是 使用robotframework測試時,本來可以通過的一個case報錯了,報錯為 internalerror 1205,u lock wait ti...

協程卡死的一種情況

在使用 libco 的時候,不正確的用法會導致協程排程不正常。分享最近遇到的問題。在協程環境下,呼叫了使用標準鎖的函式。rpc 框架是一個多執行緒多協程的模型,在一個執行緒下會開啟多個協程,請求來了之後會由協程呼叫業務處理函式。最近加了一個併發優化後,發現會出現請求卡住不呼應的問題。最終定位到就是 ...

一種簡單的死鎖檢測演算法

1.死鎖檢測 給定一組執行緒操作鎖的流程,判斷是否會發生死鎖?例如 有兩個執行緒和兩個資源,執行緒對鎖的操作如下 其中t表示執行緒id,l表示鎖id,s表示操作 1表示獲取鎖,0表示釋放鎖 t l s 1 1 1 執行緒1獲取1號鎖 2 2 2 執行緒2獲取2號鎖 1 2 1 執行緒1獲取2號鎖,保...

mysql死鎖檢測演算法 一種簡單的死鎖檢測演算法

1.死鎖檢測 給定一組執行緒操作鎖的流程,判斷是否會發生死鎖?例如 有兩個執行緒和兩個資源,執行緒對鎖的操作如下 其中t表示執行緒id,l表示鎖id,s表示操作 1表示獲取鎖,0表示釋放鎖 t l s 1 1 1 執行緒1獲取1號鎖 2 2 2 執行緒2獲取2號鎖 1 2 1 執行緒1獲取2號鎖,保...