读书人

智能指针能否用于多进程/多线程的情形

发布时间: 2012-04-04 16:38:51 作者: rapoo

智能指针能否用于多进程/多线程的情形?
会不会有什么问题?

[解决办法]
这与智能指针的设计与实现相关,如果设计与实现把多线程纳入了考虑,那么可以直接使用;否则,需要明确同步机制。
[解决办法]
不会的,
智能指针关键在于引用计数器,
定义为作互斥资源,保证进程互斥访问就可以。
[解决办法]

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;离开互斥区; 

读书人网 >C++

热点推荐