【lockcop】使用lockcop软件检测c++死锁 |
您所在的位置:网站首页 › 5600x锁44 › 【lockcop】使用lockcop软件检测c++死锁 |
【lockcop】使用lockcop软件检测c++死锁
背景:
C++多线程开发中,容易出现死锁导致程序挂起的现象。 工具:lockcop.exe,下载见: 链接:https://pan.baidu.com/s/1KRA1kzB6kvv2iqU_s7z5dA?pwd=53gd 提取码:53gd 测试过程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 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 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进行监控。现象见下图: 线程互斥进行修改,Thread1与Thread2对关键代码段的进入与退出顺序改为相同。即只修改线程2的代码。 现象是:主线程在等待,线程1在执行,线程2里面阻塞了。 再修改代码,使其恢复正常。只修改线程1,2里面执行sleep函数的位置。 现象正常,现象是:主线程在等待,线程1线程2都在执行了,没有死锁。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |