📄 9_2_3 多任务下的垃圾收集 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.htm
字号:
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> }</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
</SPAN><STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">~MGCPtr()
</SPAN></STRONG></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><STRONG><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">{</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
INT *p = (INT *)((char *)m_pAddr</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">INT_LEN)</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
Lock(g_lock)</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
*p</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt">= 1</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
Unlock(g_lock)</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> }</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> /*
</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">拷贝构造函数</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt"> */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
</SPAN><STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">MGCPtr(const MGCPtr
&gcPtr)</SPAN></STRONG></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><STRONG><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">{</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
INT *p = (INT *)((char *)gcPtr.m_pAddr</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">INT_LEN)</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
Lock(g_lock)</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
*p += 1</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
Unlock(g_lock)</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt"> </SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
m_pAddr = gcPtr.m_pAddr</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> }</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> T &
operator* () { return *m_pAddr</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">}</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> T
*operator-> () { return m_pAddr</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">}</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> operator T *()
{ return m_pAddr</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">}</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
</SPAN><STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">T *operator=(T *t)
</SPAN></STRONG></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><STRONG><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">{</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
/* </SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">将原来指向的内存引用计数减</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">1 */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
INT *p = (INT *)((char *)m_pAddr</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">INT_LEN)</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=4><SPAN
lang=EN-US>
Lock(g_lock)</SPAN><SPAN style="FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
*p</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt">= 1</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
m_pAddr = t</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
/* </SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">将新指向的内存的引用计数加</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">1 */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
p = (INT *)((char *)t</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">INT_LEN)</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
*p += 1</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
Unlock(g_lock)</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
return t</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> }</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
</SPAN><STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">MGCPtr &
operator=(MGCPtr &r) </SPAN></STRONG></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><STRONG><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
</SPAN></STRONG><SPAN lang=EN-US style="FONT-SIZE: 9pt">{ </SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
/* </SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">将原来指向的内存引用计数减</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">1 */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
INT *p = (INT *)((char *)m_pAddr</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">INT_LEN)</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
Lock(g_lock)</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
*p</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt">= 1</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
m_pAddr = t</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
/* </SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">将新指向的内存的引用计数加</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">1 */</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
p = (INT *)((char *)r.m_pAddr</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 华康简宋">-</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 9pt">INT_LEN)</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
*p += 1</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
Unlock(g_lock)</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt">
return r</SPAN><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="LINE-HEIGHT: 14pt"><SPAN lang=EN-US
style="FONT-SIZE: 9pt"> }</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 8pt; LINE-HEIGHT: 14pt"><SPAN
lang=EN-US style="FONT-SIZE: 9pt">}</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">;</SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 华康简宋">需要指出的是,为了使编码容易理解,上面代码中省去了对指针是否为空的校验。如果要在实际中能够正常运行,还需要加上对需要修改引用计数的指针是否为空的校验。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>2) </SPAN><SPAN
style="FONT-FAMILY: 华康简宋">垃圾回收内存管理函数的编码实现如下。</SPAN></P>
<P class=4 style="LINE-HEIGHT: 14.3pt"><SPAN lang=EN-US>LOCK g_lock</SPAN><SPAN
style="FONT-FAMILY: 宋体">;</SPAN><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -