例子:用mutex a鎖門,用metex b去開門,結果沒開啟,就導致了程式的死鎖。
注意:這個程式專門為了測試,mutex的問題。
#include #include #include #include #include #include using namespace std;
class data_protect;
mutex m;
mutex m1;
public:
void add_list(int val)
bool contains(int val)
};void func(data_protect& dp)
int main()
for(auto& s : dp.alist)
pthread_exit(null);
}
執行結果:死鎖,程式永遠在等待鎖的開啟。
執行結果分析:
從③處開始就開了乙個新的執行緒a,執行緒a呼叫了add_list()方法,add_list方法裡,在①處是用m去上的鎖。main函式執行緒在④處也呼叫了,add_list()方法,進去後,發現是上鎖的狀態,所以就阻塞在**,等著鎖開啟後,main函式執行緒好進去,然後在⑤處呼叫了contains方法,contains方法試圖在②處用m1去解m的鎖,所以就解不開①處的鎖,所以就導致了乙個執行緒一直等在①處的鎖的地方,就導致了死鎖。
如果把②處的m1.unlock();換成m.unlock();就能解開鎖了,就不會導致死鎖。
多執行緒同步Mutex
經典執行緒同步問題 互斥量mutex include include include long g nnum unsigned int stdcall fun void ppm unsigned int stdcall fun1 void ppm unsigned int stdcall fun2 ...
C 多執行緒 Mutex
dotnet 2010 05 29 19 07 24 閱讀151 字型大小 大 中小訂閱 互斥鎖 mutex 互斥鎖是乙個互斥的同步物件,意味著同一時間有且僅有乙個執行緒可以獲取它。互斥鎖可適用於乙個共享資源每次只能被乙個執行緒訪問的情況 函式 建立乙個處於未獲取狀態的互斥鎖 public mute...
用mutex同步多執行緒
include include dword winapi threadproc1 lpvoid lpparameter dword winapi threadproc2 lpvoid lpparameter int index 0 int tickets 100 handle hmutex int ...