﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-hxb20917</title><link>http://www.cppblog.com/hxb20917/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 20:32:17 GMT</lastBuildDate><pubDate>Tue, 09 Jun 2026 20:32:17 GMT</pubDate><ttl>60</ttl><item><title>智能指针，在多线程中的使用</title><link>http://www.cppblog.com/hxb20917/archive/2006/12/08/16150.html</link><dc:creator>hxb20917</dc:creator><author>hxb20917</author><pubDate>Fri, 08 Dec 2006 14:00:00 GMT</pubDate><guid>http://www.cppblog.com/hxb20917/archive/2006/12/08/16150.html</guid><wfw:comment>http://www.cppblog.com/hxb20917/comments/16150.html</wfw:comment><comments>http://www.cppblog.com/hxb20917/archive/2006/12/08/16150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/hxb20917/comments/commentRss/16150.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/hxb20917/services/trackbacks/16150.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial" size="2">在多线程中，往往需要协同处理数据，这里提供一个简单的模版.<br /><br />template&lt;class TYPE&gt;<br />class XSelfFreeData <br />{<br /> <br /> class _X_Data<br /> { <br />  public:  <br />   CSemaphore   m_ref_mutex;<br />   CSemaphore   m_data_mutex;<br />   int    m_refCount ;<br />   BOOL   m_data_locked;<br />   TYPE   *  m_pValue ;</font>
		</p>
		<p>
				<font face="Arial" size="2">  public: <br />   ~_X_Data(){<br />    ASSERT( m_refCount == 0 ) ;<br />     if( m_pValue ){<br />     delete m_pValue ;<br />    }<br />    m_refCount = 0 ;<br />    m_pValue = NULL ;<br />  <br />   }</font>
		</p>
		<p>
				<font face="Arial" size="2">   _X_Data(){<br />    m_pValue = new TYPE ;<br />    m_refCount = 1 ;<br />    m_data_locked = FALSE ;<br />   }<br /> <br />    void AddRef() {<br />    m_ref_mutex.Lock();<br />    m_refCount ++ ;<br />    m_ref_mutex.Unlock();<br />   }<br />   <br />   void Release() {<br />    m_ref_mutex.Lock();<br />    m_refCount -- ;<br />    m_ref_mutex.Unlock();</font>
		</p>
		<p>
				<font face="Arial" size="2">    if( m_refCount == 0 ){<br />     ASSERT( m_data_locked == FALSE ) ;<br />     delete this ;<br />    } <br />   }</font>
		</p>
		<p>
				<font face="Arial" size="2">   void LockData(){<br />    ASSERT( m_refCount &gt; 0 );<br />     m_data_mutex.Lock();<br />    m_data_locked = TRUE ;<br />   }</font>
		</p>
		<p>
				<font face="Arial" size="2">   void UnlockData(){<br />    ASSERT( m_data_locked == TRUE ) ;<br />    m_data_mutex.Unlock();<br />    m_data_locked = FALSE;<br />   }</font>
		</p>
		<p>
				<font face="Arial" size="2"> } ;</font>
		</p>
		<p>
				<font face="Arial" size="2">  _X_Data * m_pData ;</font>
		</p>
		<p>
				<font face="Arial" size="2">public:</font>
		</p>
		<p>
				<font face="Arial" size="2"> XSelfFreeData( const XSelfFreeData &amp; src )<br /> {<br />  ASSERT( src.m_pData ) ;<br />   m_pData = src.m_pData ; <br />  m_pData-&gt;AddRef() ;<br /> }</font>
		</p>
		<p>
				<font face="Arial" size="2"> XSelfFreeData() { <br />   m_pData   = NULL ;<br /> }</font>
		</p>
		<p>
				<font face="Arial" size="2"> void Release(){<br />     if( m_pData )<br />     {<br />      m_pData-&gt;Release(); <br />      m_pData = NULL ; <br />     }<br /> } </font>
		</p>
		<p>
				<font face="Arial" size="2"> BOOL IsNull(){ return m_pData == NULL ; }</font>
		</p>
		<p>
				<font face="Arial" size="2"> void Create(){<br />  if( m_pData ){<br />   m_pData-&gt;Release();<br />  }<br />  m_pData = new _X_Data ;<br /> }</font>
		</p>
		<p>
				<font face="Arial" size="2"> ~XSelfFreeData(){<br />  if( m_pData ){<br />   m_pData-&gt;Release();<br />  }<br /> }</font>
		</p>
		<p>
				<font face="Arial" size="2"> void operator = ( const XSelfFreeData &amp; src ){<br />  if( m_pData ){<br />   m_pData-&gt;Release();<br />  }</font>
		</p>
		<p>
				<font face="Arial" size="2">  ASSERT( src.m_pData ) ;</font>
		</p>
		<p>
				<font face="Arial" size="2">  m_pData = src.m_pData ;<br />   <br />  m_pData-&gt;AddRef() ;<br />   <br /> }</font>
		</p>
		<p>
				<font face="Arial" size="2"> void  LockData(){ ASSERT( m_pData ) ; m_pData-&gt;LockData(); }</font>
		</p>
		<p>
				<font face="Arial" size="2">/* TYPE * operator -&gt;()<br /> {<br />  ASSERT( m_pData ) ; <br />  return m_pData-&gt;m_pValue;<br /> }<br /> */<br /> void  SetValue( const TYPE &amp; value ){<br />  ASSERT( m_pData ) ; <br />  *m_pData-&gt;m_pValue = value ;<br /> }<br /> </font>
		</p>
		<p>
				<font face="Arial" size="2"> TYPE   GetValue(){<br />  ASSERT( m_pData ) ; <br />    return *m_pData-&gt;m_pValue ;<br /> }</font>
		</p>
		<p>
				<font face="Arial" size="2"> TYPE  *  GetValuePtr(){<br />  ASSERT( m_pData ) ; <br />    return  m_pData-&gt;m_pValue ;<br /> }</font>
		</p>
		<p>
				<font face="Arial" size="2"> void  UnlockData(){<br />   ASSERT( m_pData ) ; <br />   m_pData-&gt;UnlockData(); <br /> }</font>
		</p>
		<p>
				<font face="Arial" size="2">};</font>
		</p>
<img src ="http://www.cppblog.com/hxb20917/aggbug/16150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hxb20917/" target="_blank">hxb20917</a> 2006-12-08 22:00 <a href="http://www.cppblog.com/hxb20917/archive/2006/12/08/16150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>