posix

来自「详细描述了线程的基本知识己在实际开发中的应用适合初学者的深入研究。」· 代码 · 共 729 行 · 第 1/5 页

TXT
729
字号
lang=EN-US><FONT face=Verdana>C</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">库函数都不是</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>Cancelation-point</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">;但</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>CANCEL</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">信号会使线程从阻塞的系统调用中退出,并置</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>EINTR</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">错误码,因此可以在需要作为</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>Cancelation-point</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_testcancel()</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></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">pthread_testcancel();<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"><SPAN 
      style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>retcode = read(fd, 
      buffer, length);<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"><SPAN 
      style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; 
      </SPAN>pthread_testcancel();</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>&nbsp;</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><A name=N100B7><B><SPAN lang=EN-US 
style="FONT-SIZE: 11.5pt; FONT-FAMILY: Arial; mso-bidi-font-size: 9.0pt">2</SPAN></B></A><SPAN 
style="mso-bookmark: N100B7"><B><SPAN 
style="FONT-SIZE: 11.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></SPAN><SPAN 
style="mso-bookmark: N100B7"><B><SPAN lang=EN-US 
style="FONT-SIZE: 11.5pt; FONT-FAMILY: Arial; mso-bidi-font-size: 9.0pt">4 
</SPAN></B></SPAN><SPAN style="mso-bookmark: N100B7"><B><SPAN 
style="FONT-SIZE: 11.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></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_testcancel()</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><A name=N100C0><B><SPAN lang=EN-US 
style="FONT-SIZE: 11.5pt; FONT-FAMILY: Arial; mso-bidi-font-size: 9.0pt">2</SPAN></B></A><SPAN 
style="mso-bookmark: N100C0"><B><SPAN 
style="FONT-SIZE: 11.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></SPAN><SPAN 
style="mso-bookmark: N100C0"><B><SPAN lang=EN-US 
style="FONT-SIZE: 11.5pt; FONT-FAMILY: Arial; mso-bidi-font-size: 9.0pt">5 
</SPAN></B></SPAN><SPAN style="mso-bookmark: N100C0"><B><SPAN 
style="FONT-SIZE: 11.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></SPAN><SPAN 
style="mso-bookmark: N100C0"><B><SPAN lang=EN-US 
style="FONT-SIZE: 11.5pt; FONT-FAMILY: Arial; mso-bidi-font-size: 9.0pt">pthread</SPAN></B></SPAN><SPAN 
style="mso-bookmark: N100C0"><B><SPAN 
style="FONT-SIZE: 11.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></SPAN></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>int pthread_cancel(pthread_t 
thread) <BR></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</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">线程,如果成功则返回</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>0</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">,否则为非</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>0</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</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></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>int pthread_setcancelstate(int 
state, int *oldstate) <BR></FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">设置本线程对</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>Cancel</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">信号的反应,</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>state</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_CANCEL_ENABLE</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_CANCEL_DISABLE</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">,分别表示收到信号后设为</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>CANCLED</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">状态和忽略</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>CANCEL</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">信号继续运行;</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>old_state</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">如果不为</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>NULL</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">则存入原来的</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>Cancel</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></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>int pthread_setcanceltype(int 
type, int *oldtype) <BR></FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">设置本线程取消动作的执行时机,</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>type</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_CANCEL_DEFFERED</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_CANCEL_ASYCHRONOUS</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">,仅当</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>Cancel</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">状态为</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>Enable</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">时有效,分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作(退出);</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>oldtype</FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">如果不为</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>NULL</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></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>void pthread_testcancel(void) 
<BR></FONT></SPAN><SPAN 
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">检查本线程是否处于</SPAN><SPAN 
lang=EN-US><FONT face=Verdana>Canceld</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></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT 
face=Verdana>&nbsp;</FONT></o:p></SPAN></P>
<P class=Web1 style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt"><FONT 
size=3><FONT face=宋体><SPAN class=7><B><SPAN 
style="COLOR: #666666; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">线程私有数据</SPAN></B></SPAN><B><SPAN 
lang=EN-US 
style="COLOR: #666666; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></B></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?