總結如下:
1.評估一下程式,看看是否確實需要有兩個mutex?如果只有乙個mutex,就不存在死鎖的問題了。
2.避免在鎖住mutex的同時,去呼叫另外的我們不熟悉的函式,因為有可能這個函式包含了另外的鎖,所以我們必須清楚我們所呼叫的其他的函式或者類。
3.如果確實需要在同一時間使用兩個以上的mutex,那麼可以使用c++標準庫提供的std::lock函式,這樣就可以確保mutex的順序是相同的。在某些極端的情況下可能沒法使用std::lock函式,這時候就要確保鎖的先後順序是一致的(如例子中,我們應該確保locker和locker2在兩個函式shared_print和shared_print2**現的先後順序是一致的)。
#include #include #include #include #include //std::mutex mu;
////void shared_print(std::string msg, int id)
//class logfile
void shared_print(std::string id, int value)
void shared_print2(std::string id, int value)
protected:
private:
std::mutex m_mutex;
std::mutex m_mutex2;
std::ofstream f;//資源f是類的成員,也就是說在類的保護之下。這樣的話要想用資源必須要用類,這樣就起到了資源和鎖繫結到一起的作用
};void function1(logfile& log)
int main()
t1.join();
return 0;
}
MySQL如何處理死鎖
官方定義如下 兩個事務都持有對方需要的鎖,並且在等待對方釋放,並且雙方都不會釋放自己的鎖。這個就好比你有乙個人質,對方有乙個人質,你們倆去談判說換人。你讓對面放人,對面讓你放人。看到這裡,也許你會有這樣的疑問,事務和談判不一樣,為什麼事務不能使用完鎖之後立馬釋放呢?居然還要操作完了之後一直持有鎖?這...
mysql處理死鎖 mysql如何處理死鎖問題
mysql有兩種死鎖處理方式 1 等待,直到超時 innodb lock wait timeout 50s 2 發起死鎖檢測,主動回滾一條事務,讓其他事務繼續執行 innodb deadlock detect on 由於效能原因,一般都是使用死鎖檢測來進行處理死鎖。死鎖檢測 死鎖檢測的原理是構建乙個...
SQL Server裡如何處理死鎖
在今天的文章裡,我想談下sql server裡如何處理死鎖。當2個查詢彼此等待時會發生死鎖,沒有乙個查詢可以繼續它們的操作。首先我想給你大致講下sql server如何處理死鎖。最後我會展示下sql sever裡特定的死鎖型別,還有你如何避免和解決它們。死鎖的好處是sql server自動檢測並解決...