• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++死锁解决心得

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
一、 概述
C++多线程开发中,容易出现死锁导致程序挂起的现象。

关于死锁的信息,见百度百科http://baike.baidu.com/view/121723.htm

解决步骤分为三步:
1、检测死锁线程。
2、打印线程信息。
3、修改死锁程序。

二、 程序示例
VS2005创建支持MFC的win32控制台程序。
代码见示例代码DeadLockTest.cpp。
  1. // DeadLockTest.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "DeadLockTest.h"  
  6.   
  7. #ifdef _DEBUG  
  8. #define new DEBUG_NEW  
  9. #endif  
  10.   
  11.   
  12. // The one and only application object  
  13.   
  14. CWinApp theApp;  
  15.   
  16. using namespace std;  
  17.   
  18. CRITICAL_SECTION cs1;  
  19. CRITICAL_SECTION cs2;  
  20. CRITICAL_SECTION csprint;  
  21.   
  22. //初始化关键代码段  
  23. void InitMyCriticalSection();  
  24. //删除关键代码段  
  25. void DeleteMyCriticalSection();  
  26. //打印信息  
  27. void PrintString(const CString& strInfo);  
  28.   
  29. DWORD WINAPI Thread1(LPVOID lpParameter);  
  30. DWORD WINAPI Thread2(LPVOID lpParameter);  
  31.   
  32. int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])  
  33. {  
  34.     int nRetCode = 0;  
  35.   
  36.     // initialize MFC and print and error on failure  
  37.     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))  
  38.     {  
  39.         // TODO: change error code to suit your needs  
  40.         _tprintf(_T("Fatal Error: MFC initialization failed\n"));  
  41.         nRetCode = 1;  
  42.   
  43.         return nRetCode;  
  44.     }  
  45.   
  46.     //初始化关键代码段  
  47.     InitMyCriticalSection();  
  48.   
  49.     //创建线程  
  50.     HANDLE hThread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);  
  51.     HANDLE hThread2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);  
  52.   
  53.     //等待线程结束  
  54.     WaitForSingleObject(hThread1, INFINITE);  
  55.     WaitForSingleObject(hThread2, INFINITE);  
  56.   
  57.     //关闭线程句柄  
  58.     CloseHandle(hThread1);  
  59.     CloseHandle(hThread2);  
  60.   
  61.     //释放关键代码段  
  62.     DeleteMyCriticalSection();  
  63.   
  64.     return nRetCode;  
  65. }  
  66.   
  67. void InitMyCriticalSection()  
  68. {  
  69.     InitializeCriticalSection(&cs1);  
  70.     InitializeCriticalSection(&cs2);  
  71.     InitializeCriticalSection(&csprint);  
  72. }  
  73.   
  74. void DeleteMyCriticalSection()  
  75. {  
  76.     DeleteCriticalSection(&cs1);  
  77.     DeleteCriticalSection(&cs2);  
  78.     DeleteCriticalSection(&csprint);  
  79. }  
  80.   
  81. DWORD WINAPI Thread1(LPVOID lpParameter)  
  82. {  
  83.     for (int i = 0; i < 5; i++)  
  84.     {  
  85.         EnterCriticalSection(&cs1);  
  86.         Sleep(500);  
  87.         EnterCriticalSection(&cs2);  
  88.   
  89.         PrintString(_T("Thread1"));  
  90.   
  91.         LeaveCriticalSection(&cs2);  
  92.         LeaveCriticalSection(&cs1);  
  93.     }  
  94.   
  95.     return 1;  
  96. }  
  97.   
  98. DWORD WINAPI Thread2(LPVOID lpParameter)  
  99. {  
  100.     for (int i = 0; i < 5; i++)  
  101.     {  
  102.         EnterCriticalSection(&cs2);  
  103.         Sleep(500);  

  104. 鲜花

    握手

    雷人

    路过

    鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap