【lockcop】使用lockcop软件检测c++死锁

【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都在执行了,没有死锁。
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值