关闭

C++死锁解决心得

发表于:2012-8-09 10:21

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:segen_jaa    来源:51Testing软件测试网采编

  一、概述

  C++多线程开发中,容易出现死锁导致程序挂起的现象。

  解决步骤分为三步:

  1、检测死锁线程。

  2、打印线程信息。

  3、修改死锁程序。

  二、程序示例

  VS2005创建支持MFC的win32控制台程序。

  代码见示例代码DeadLockTest.cpp。

// DeadLockTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "DeadLockTest.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// The one and only application object

CWinApp theApp;

using namespace std;

CRITICAL_SECTION cs1;
CRITICAL_SECTION cs2;
CRITICAL_SECTION csprint;

//初始化关键代码段
void InitMyCriticalSection();
//删除关键代码段
void DeleteMyCriticalSection();
//打印信息
void PrintString(const CString& strInfo);

DWORD WINAPI Thread1(LPVOID lpParameter);
DWORD WINAPI Thread2(LPVOID lpParameter);

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: MFC initialization failed\n"));
        nRetCode = 1;

        return nRetCode;
    }

    //初始化关键代码段
    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 nRetCode;
}

void InitMyCriticalSection()
{
    InitializeCriticalSection(&cs1);
    InitializeCriticalSection(&cs2);
    InitializeCriticalSection(&csprint);
}

void DeleteMyCriticalSection()
{
    DeleteCriticalSection(&cs1);
    DeleteCriticalSection(&cs2);
    DeleteCriticalSection(&csprint);
}

DWORD WINAPI Thread1(LPVOID lpParameter)
{
    for (int i = 0; i < 5; i++)
    {
        EnterCriticalSection(&cs1);
        Sleep(500);
        EnterCriticalSection(&cs2);

        PrintString(_T("Thread1"));

        LeaveCriticalSection(&cs2);
        LeaveCriticalSection(&cs1);
    }

    return 1;
}

DWORD WINAPI Thread2(LPVOID lpParameter)
{
    for (int i = 0; i < 5; i++)
    {
        EnterCriticalSection(&cs2);
        Sleep(500);
        EnterCriticalSection(&cs1);

        PrintString(_T("Thread2"));

        LeaveCriticalSection(&cs1);
        LeaveCriticalSection(&cs2);
    }

    return 1;
}

void PrintString(const CString& strInfo)
{
    EnterCriticalSection(&csprint);
    wcout<<(const TCHAR*)strInfo<<endl;
    LeaveCriticalSection(&csprint);
}

  运行DeadLockTest.exe,程序挂起。

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号