📄 posix
字号:
face=Verdana> </FONT></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><B><SPAN
style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-bidi-font-size: 9.0pt">概念及作用</SPAN></B></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">在单线程程序中,我们经常要用到</SPAN><SPAN
lang=EN-US><FONT face=Verdana>"</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">全局变量</SPAN><SPAN
lang=EN-US><FONT face=Verdana>"</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">以实现多个函数间共享数据。在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。但有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问,比如程序可能需要每个线程维护一个链表,而使用相同的函数操作,最简单的办法就是使用同名而不同变量地址的线程相关数据结构。这样的数据结构可以由</SPAN><SPAN
lang=EN-US><FONT face=Verdana>Posix</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">线程库维护,称为线程私有数据(</SPAN><SPAN
lang=EN-US><FONT face=Verdana>Thread-specific Data</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">,或</SPAN><SPAN
lang=EN-US><FONT face=Verdana>TSD</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">)。</SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><B><SPAN
style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-bidi-font-size: 9.0pt">创建和注销</SPAN></B></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><SPAN lang=EN-US><FONT face=Verdana>Posix</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">定义了两个</SPAN><SPAN
lang=EN-US><FONT face=Verdana>API</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">分别用来创建和注销</SPAN><SPAN
lang=EN-US><FONT face=Verdana>TSD</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">:</SPAN></P>
<TABLE class=MsoNormalTable
style="BACKGROUND: #eeeeee; WIDTH: 100%; mso-cellspacing: 0cm; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt"
cellSpacing=0 cellPadding=0 width="100%" border=1>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-lastrow: yes">
<TD
style="PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BORDER-LEFT-COLOR: #d4d0c8; BORDER-BOTTOM-COLOR: #d4d0c8; PADDING-BOTTOM: 3.75pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 3.75pt; BACKGROUND-COLOR: transparent; BORDER-RIGHT-COLOR: #d4d0c8">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"
align=left><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 9.0pt"><o:p> </o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"
align=left><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 9.0pt">int
pthread_key_create(pthread_key_t *key, void (*destr_function) (void
*))</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><SPAN lang=EN-US><o:p><FONT
face=Verdana> </FONT></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">该函数从</SPAN><SPAN
lang=EN-US><FONT face=Verdana>TSD</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">池中分配一项,将其值赋给</SPAN><SPAN
lang=EN-US><FONT face=Verdana>key</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">供以后访问使用。如果</SPAN><SPAN
lang=EN-US><FONT face=Verdana>destr_function</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">不为空,在线程退出(</SPAN><SPAN
lang=EN-US><FONT face=Verdana>pthread_exit()</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">)时将以</SPAN><SPAN
lang=EN-US><FONT face=Verdana>key</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">所关联的数据为参数调用</SPAN><SPAN
lang=EN-US><FONT face=Verdana>destr_function()</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">,以释放分配的缓冲区。</SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">不论哪个线程调用</SPAN><SPAN
lang=EN-US><FONT face=Verdana>pthread_key_create()</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">,所创建的</SPAN><SPAN
lang=EN-US><FONT face=Verdana>key</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">都是所有线程可访问的,但各个线程可根据自己的需要往</SPAN><SPAN
lang=EN-US><FONT face=Verdana>key</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中填入不同的值,这就相当于提供了一个同名而不同值的全局变量。在</SPAN><SPAN
lang=EN-US><FONT face=Verdana>LinuxThreads</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的实现中,</SPAN><SPAN
lang=EN-US><FONT face=Verdana>TSD</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">池用一个结构数组表示:</SPAN></P>
<TABLE class=MsoNormalTable
style="BACKGROUND: #eeeeee; WIDTH: 100%; mso-cellspacing: 0cm; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt"
cellSpacing=0 cellPadding=0 width="100%" border=1>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-lastrow: yes">
<TD
style="PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BORDER-LEFT-COLOR: #d4d0c8; BORDER-BOTTOM-COLOR: #d4d0c8; PADDING-BOTTOM: 3.75pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 3.75pt; BACKGROUND-COLOR: transparent; BORDER-RIGHT-COLOR: #d4d0c8">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"
align=left><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 9.0pt"><o:p> </o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"
align=left><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 9.0pt">static
struct pthread_key_struct pthread_keys[PTHREAD_KEYS_MAX] = { { 0, NULL }
};</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><SPAN lang=EN-US><o:p><FONT
face=Verdana> </FONT></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">创建一个</SPAN><SPAN
lang=EN-US><FONT face=Verdana>TSD</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">就相当于将结构数组中的某一项设置为</SPAN><SPAN
lang=EN-US><FONT face=Verdana>"in_use"</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">,并将其索引返回给</SPAN><SPAN
lang=EN-US><FONT face=Verdana>*key</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">,然后设置</SPAN><SPAN
lang=EN-US><FONT face=Verdana>destructor</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">函数为</SPAN><SPAN
lang=EN-US><FONT face=Verdana>destr_function</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">注销一个</SPAN><SPAN
lang=EN-US><FONT face=Verdana>TSD</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">采用如下</SPAN><SPAN
lang=EN-US><FONT face=Verdana>API</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">:</SPAN></P>
<TABLE class=MsoNormalTable
style="BACKGROUND: #eeeeee; WIDTH: 100%; mso-cellspacing: 0cm; mso-padding-alt: 3.75pt 3.75pt 3.75pt 3.75pt"
cellSpacing=0 cellPadding=0 width="100%" border=1>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-lastrow: yes">
<TD
style="PADDING-RIGHT: 3.75pt; PADDING-LEFT: 3.75pt; BORDER-LEFT-COLOR: #d4d0c8; BORDER-BOTTOM-COLOR: #d4d0c8; PADDING-BOTTOM: 3.75pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 3.75pt; BACKGROUND-COLOR: transparent; BORDER-RIGHT-COLOR: #d4d0c8">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"
align=left><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 9.0pt"><o:p> </o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"
align=left><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 9.0pt">int
pthread_key_delete(pthread_key_t key)</SPAN><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -