最近在学习网络多线程编程时遇到的一个问题,就是使用临界区时,由于使用不当而触发的死锁。
表象就是 应用程序安全卡死,内存和CPU消耗没有变化;实质是:控制共享资源的临界区没有进行正确的释放。
解决过程:
1.出现上述表象之后,就中断程序,VS截图如下:
2. 如果是VS,这时编译器就会弹出提示框
3. 点击确定后查看线程视图:
4.发现子线程都停留在IOCPMgr::AddShowMsg这个函数,这函数的功能主要是将输出提示信息入列,然后定时打印,应该就是在这里卡住了。
切换任意一个子线程跟进去查看运行情况,发现所有子线程同样停留在等待临界区这一步
应该就是m_csShowMsg这个互斥量的使用上出现了问题,然后查找起引用,逐一排查,结果在发现提取显示信息的时候,在使用了m_csShowMsg
提取到数据之后,没有正确的释放。
修改如下:
或者将互斥量封装成一个类对象,当其离开作用域时自动释放,这样可以省去上述麻烦,但也同样存在漏洞。
就是可能你在还未使用完公共资源的时候,过早交还了临界区,导致数据异常。