读书人

一个多线程加锁有关问题。巨巨们!

发布时间: 2012-04-09 13:41:24 作者: rapoo

一个多线程加锁问题。。。。求助巨巨们!!!

C/C++ code
typedef std::map<void*, CCritSect*>        lock_map_t;class CCritSect{public:    friend class BDThreadPool;    CCritSect() { InitializeCriticalSection(&_critSection); }    ~CCritSect() { DeleteCriticalSection(&_critSection); }private:    void Acquire(){EnterCriticalSection(&_critSection);}    void Release(){LeaveCriticalSection(&_critSection);}    CRITICAL_SECTION _critSection;};


C/C++ code
void BDThreadPool::Lock(void * p){    CCritSect * pcs = NULL;    m_lock_op.Acquire();    lock_map_t::iterator ite = m_lock_map.find(p);    if (ite == m_lock_map.end())    {        pcs = new CCritSect();        m_lock_map[p] = pcs;    }    pcs = m_lock_map[p];    m_lock_op.Release();    pcs->Acquire();}void BDThreadPool::UnLock(void * p){    m_lock_op.Acquire();    lock_map_t::iterator ite = m_lock_map.find(p);    if (ite != m_lock_map.end())    {        m_lock_map[p]->Release();        SAFE_DELETE(ite->second);        m_lock_map.erase(ite);    }    m_lock_op.Release();}

lock_map_t m_lock_map;
CCritSect m_lock_op;
上面这两个是线程池内部对象,大家看看这段加锁代码有什么问题吗?程序运行起来,大多数情况下不会崩,但是偶尔会崩。
崩溃了。。。初学多线程,好难调试啊!

[解决办法]
BDThreadPool这个类里面都有什么样的数据成员
[解决办法]
把BDThreadPool的声明列一下呢,另外最好把类的使用情况也贴出来看看。
[解决办法]
做自动锁最方边

读书人网 >C++

热点推荐