智能指针能否用于多进程/多线程的情形?
会不会有什么问题?
[解决办法]
这与智能指针的设计与实现相关,如果设计与实现把多线程纳入了考虑,那么可以直接使用;否则,需要明确同步机制。
[解决办法]
不会的,
智能指针关键在于引用计数器,
定义为作互斥资源,保证进程互斥访问就可以。
[解决办法]
- C/C++ code
inline LONG AddRef()throw()// 无异常抛出 { [color=#FF6600]::InterlockedIncrement(m_plRefCount);[/color] return *m_plRefCount; } LONG Release()throw() { ASSERT(*m_plRefCount >= 0); AutoSync(*m_sSyncObj); [color=#FF6600] ::InterlockedDecrement(m_plRefCount);[/color] if (*m_plRefCount <= 0) { if(NULL != m_pPtr){ delete m_pPtr; // 如果引用计数为0,则删除实值对象 m_pPtr = NULL; delete m_plRefCount; } return 0; // must return 0 } return *m_plRefCount; }
[解决办法]
主要问题在于拷贝的时候和析构的时候考虑多线程安全问题,更具体一点就是:
例如:析构函数,首先--count,如果count==0,那么就delete p;
但是,假如没有安全考虑的话,那么假如当前count==1,进程A析构--count,count==0.
进程B析构,--count,count==-1,这样是有问题的,还有其他情况,不解释了.
想让它安全就是让count的--操作的语句块互斥.
- C/C++ code
进入互斥区;if(--*count==0){ delete p;}离开互斥区;拷贝构造也一样,进入互斥区;*obj.count++;count=obj.count;离开互斥区;