posix
来自「详细描述了线程的基本知识己在实际开发中的应用适合初学者的深入研究。」· 代码 · 共 729 行 · 第 1/5 页
TXT
729 行
lang=EN-US><FONT face=Verdana>do_fork()</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">提供了很多参数,包括</SPAN><SPAN
lang=EN-US><FONT face=Verdana>CLONE_VM</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">(共享内存空间)、</SPAN><SPAN
lang=EN-US><FONT face=Verdana>CLONE_FS</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">(共享文件系统信息)、</SPAN><SPAN
lang=EN-US><FONT face=Verdana>CLONE_FILES</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">(共享文件描述符表)、</SPAN><SPAN
lang=EN-US><FONT face=Verdana>CLONE_SIGHAND</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">(共享信号句柄表)和</SPAN><SPAN
lang=EN-US><FONT face=Verdana>CLONE_PID</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">(共享进程</SPAN><SPAN
lang=EN-US><FONT face=Verdana>ID</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>fork</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">系统调用时,内核调用</SPAN><SPAN
lang=EN-US><FONT face=Verdana>do_fork()</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_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>,</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">则最终设置了所有这些属性来调用</SPAN><SPAN
lang=EN-US><FONT face=Verdana>__clone()</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">,而这些参数又全部传给核内的</SPAN><SPAN
lang=EN-US><FONT face=Verdana>do_fork()</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>"</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">拥有共享的运行环境,只有栈是独立的,由</SPAN><SPAN
lang=EN-US><FONT face=Verdana>__clone()</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 lang=EN-US><FONT face=Verdana>Linux</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</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</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_manager()</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">,每个进程独立且唯一)来管理线程的创建和终止,为线程分配线程</SPAN><SPAN
lang=EN-US><FONT face=Verdana>ID</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>pthread_create()</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=2><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></A></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><A name=N10095><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: N10095"><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: N10095"><B><SPAN lang=EN-US
style="FONT-SIZE: 11.5pt; FONT-FAMILY: Arial; mso-bidi-font-size: 9.0pt">1
</SPAN></B></SPAN><SPAN style="mso-bookmark: N10095"><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></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><A name=N1009E><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: N1009E"><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: N1009E"><B><SPAN lang=EN-US
style="FONT-SIZE: 11.5pt; FONT-FAMILY: Arial; mso-bidi-font-size: 9.0pt">2
</SPAN></B></SPAN><SPAN style="mso-bookmark: N1009E"><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>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>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>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>Cancelation</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>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>pthread_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>CANCELED</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></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 14.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan"
align=left><A name=N100AA><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: N100AA"><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: N100AA"><B><SPAN lang=EN-US
style="FONT-SIZE: 11.5pt; FONT-FAMILY: Arial; mso-bidi-font-size: 9.0pt">3
</SPAN></B></SPAN><SPAN style="mso-bookmark: N100AA"><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>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>pthread_join()</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>pthread_cond_wait()</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_cond_timedwait()</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">、</SPAN><SPAN
lang=EN-US><FONT face=Verdana>sem_wait()</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">、</SPAN><SPAN
lang=EN-US><FONT face=Verdana>sigwait()</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">等函数以及</SPAN><SPAN
lang=EN-US><FONT face=Verdana>read()</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">、</SPAN><SPAN
lang=EN-US><FONT face=Verdana>write()</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</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</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</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的手册页声称,由于</SPAN><SPAN
lang=EN-US><FONT face=Verdana>LinuxThread</FONT></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">库与</SPAN><SPAN
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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?