【lockcop】使用lockcop软件检测c++死锁
背景:
C++多线程开发中,容易出现死锁导致程序挂起的现象。
工具:
lockcop.exe,下载见:
链接:https://pan.baidu.com/s/1KRA1kzB6kvv2iqU_s7z5dA?pwd=53gd
提取码:53gd
或者
http://www.drv5.cn/sfinfo/15876.html
测试过程
1.使用VS2017编写一段代码,见下面,调试运行起来,程序名为memeroy.exe,
CRITICAL_SECTION cs1;
CRITICAL_SECTION cs2;
CRITICAL_SECTION csprint;
//初始化关键代码段
void InitMyCriticalSection();
void InitMyCriticalSection()
{
InitializeCriticalSection(&cs1);
InitializeCriticalSection(&cs2);
InitializeCriticalSection(&csprint);
}
//删除关键代码段
void DeleteMyCriticalSection();
void DeleteMyCriticalSection()
{
DeleteCriticalSection(&cs1);
DeleteCriticalSection(&cs2);
DeleteCriticalSection(&csprint);
}
//打印信息
void PrintString(std::string str);
void PrintString(std::string str)
{
std::cout << str << std::endl;
}
DWORD WINAPI Thread1(LPVOID lpParameter);
DWORD WINAPI Thread1(LPVOID lpParameter)
{
std::string str = std::to_string(GetCurrentThreadId());
str = "Thread1 id is" + str;
PrintString(str);
for (int i = 0; i < 500; i++)
{
EnterCriticalSection(&cs1);
Sleep(100);
EnterCriticalSection(&cs2);
PrintString(str);
LeaveCriticalSection(&cs2);
LeaveCriticalSection(&cs1);
}
return 1;
}
DWORD WINAPI Thread2(LPVOID lpParameter);
DWORD WINAPI Thread2(LPVOID lpParameter)
{
std::string str = std::to_string(GetCurrentThreadId());
str = "Thread2 id is" + str;
PrintString(str);
for (int i = 0; i < 500; i++)
{
EnterCriticalSection(&cs2);
Sleep(100);
EnterCriticalSection(&cs1);
PrintString(str);
LeaveCriticalSection(&cs1);
LeaveCriticalSection(&cs2);
}
return 1;
}
int main()
{
std::string str = std::to_string(GetCurrentThreadId());
str = " main Thread id is" + str;
PrintString(str);
//初始化关键代码段
InitMyCriticalSection();
//创建线程
HANDLE hThread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);
HANDLE hThread2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);
//等待线程结束
WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
//关闭线程句柄
CloseHandle(hThread1);
CloseHandle(hThread2);
//释放关键代码段
DeleteMyCriticalSection();
return 1;
}
2.运行lockcop软件,在processes找到memeroy.exe进行监控。现象见下图:
1.线程32064:等待线程33212、线程33236完成
2. 线程33212和线程33236发生死锁现象。
死锁修改
线程互斥进行修改,Thread1与Thread2对关键代码段的进入与退出顺序改为相同。即只修改线程2的代码。
现象是:主线程在等待,线程1在执行,线程2里面阻塞了。
再修改代码,使其恢复正常。只修改线程1,2里面执行sleep函数的位置。
现象正常,现象是:主线程在等待,线程1线程2都在执行了,没有死锁。