一个多线程加锁问题。。。。求助巨巨们!!!
- 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的声明列一下呢,另外最好把类的使用情况也贴出来看看。
[解决办法]
做自动锁最方边