加载中…
个人资料
南冠彤
南冠彤
  • 博客等级:
  • 博客积分:0
  • 博客访问:415,028
  • 关注人气:59
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

(转)死锁检测(1)

(2011-06-28 14:24:48)
标签:

杂谈

分类: CPP/C
俺自己设计了一个简单的检测的方法,测试了下能测出
a中先锁m1再锁m2
线程b中先锁m2再锁m1时造成死锁
然后用在了自己正在写的工程中,很幸运的真的叫俺找出了死锁的地方

虽然大家都说不可能,但自己仍抱有一丝侥幸与不甘,由于自己的经验与知识有限,不知道有哪些会死锁的情况还没有考虑到,或是说下面的检测方法有哪点是不对的,真心请教


思路是每当要加锁(假设锁是m)时,就查看本线程以外其它线程中已经加的锁中是否有此锁,如果没有,就把这个锁保存下来,如果有,假设本线程是线程a,其它线程中有此锁的线程是线程b,就再查看b线程中这个锁后面的锁中是否有a线程中除本锁m外的锁,如果有,就说明死锁,如果没有就可以把这个锁正常锁上,保存下来

.h
C/C++ code
#pragma once #include "Singleton.h"#include "Mutex.h"#include <vector>using namespace std; class MutexMgr_t : public Singleton<MutexMgr_t>{ friend class Singleton<MutexMgr_t>; public: MutexMgr_t(void); ~MutexMgr_t(void); public: void lock(Mutex * m); void unlock(Mutex * m); private: // 得到指定id线程所在容器中的位置,如果没有此id的线程,会自动在容器中加一个 int getThreadIDIndex(DWORD id); private: struct threadInfo { threadInfo(DWORD id):id(id){}; DWORD id; vector<Mutex *> mutexs; }; typedef vector<Mutex *> vcMutexs; typedef vector<threadInfo> vcThreadInfo; vcThreadInfo threads; Mutex m; }; #define MutMgr MutexMgr_t::GetSingleton()




.cpp

C/C++ code
#include "MutexMgr_t.h"#include "threadSync_t.h"#include <assert.h>#include "Tools.h" MutexMgr_t::MutexMgr_t(void) { } MutexMgr_t::~MutexMgr_t(void) { } void MutexMgr_t::lock(Mutex * m) { this->m.Lock(); DWORD id = GetCurrentThreadId(); int index = getThreadIDIndex(id); // 遍历本线程之外的锁,看是否有此锁 for (int i=0; i<(int)threads.size(); i++) { if (i==index) continue; vcMutexs::iterator iter; for (iter=threads[i].mutexs.begin(); iter!=threads[i].mutexs.end(); iter++) { // 在其它线程中找到此锁 if (*iter==m) { // 看此锁之前的(非此锁的)锁这个线程中之后是否有 for (;iter!=threads[i].mutexs.end(); iter++) { for (int j=0; j<(int)threads[index].mutexs.size(); j++) { if (threads[index].mutexs[j]==m) continue; if (*iter==threads[index].mutexs[j]) { // 要死锁啦~~ //assert(0); LogTxt("出现死锁"); } } } break; } } } // 不会造成死锁,可以成功加锁 threads[index].mutexs.push_back(m); this->m.Unlock(); } void MutexMgr_t::unlock(Mutex * m) { this->m.Lock(); DWORD id = GetCurrentThreadId(); int index = getThreadIDIndex(id); vcMutexs::iterator iter=threads[index].mutexs.end()-1; for (int i=(int)threads[index].mutexs.size()-1; i>=0; i--, iter--) { if (threads[index].mutexs[i]==m) { threads[index].mutexs.erase(iter); this->m.Unlock(); return; } } this->m.Unlock(); } int MutexMgr_t::getThreadIDIndex(DWORD id) { vcThreadInfo::iterator iter; int index = 0; for (iter=threads.begin(); iter!=threads.end(); iter++) { if (iter->id==id) { return index; } index++; } threads.push_back(threadInfo(id)); return index; }

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
后一篇:(转)死锁检测
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    后一篇 >(转)死锁检测
      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有