📄 csdn_文档中心_win32多线程程序设计学习笔记(第六章 下).htm
字号:
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
</SPAN></B><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">也许是最好的方法了(看看书<SPAN
lang=EN-US>P172-P173你是否会有这种感觉呢?);<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">但<B><SPAN
lang=EN-US style="COLOR: red">I/O Completion Ports</SPAN><SPAN
lang=EN-US> </SPAN></B>好像很难理解,我试着从自己理解的角度来写写心得(也许不对);<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">描述:<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">把</SPAN><B><SPAN
lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">I/O
Completion Ports</SPAN></B><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">看作容器,那么在这个容器中放置若干个线程(书上说最好是<SPAN
lang=EN-US>cpu个数*2+2),这些个线程</SPAN></SPAN><B><SPAN
style="COLOR: blue; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">随时随地的将被激活</SPAN></B><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">去服务<SPAN
lang=EN-US>I/O请求。<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">为什么<B><SPAN
lang=EN-US style="COLOR: red">I/O Completion Ports</SPAN></B><SPAN
style="COLOR: black">会很有效率?我是这样想的:首先容器中保持的线程可以随时承担服务<SPAN
lang=EN-US>I/O请求的任务,其主要特点是:</SPAN></SPAN><B><SPAN
style="COLOR: blue">两个线程在不同的时间可以服务同一个<SPAN
lang=EN-US>I/O请求</SPAN></SPAN></B><SPAN style="COLOR: black">;<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">第二:这些个线程的调度由系统选择安排。系统总是在它认为最合适的时机去调度线程做最合适的事。书上还说了其它的一些有利于效率的工作,我就不再一一描述了。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">下面我们来看一下运用</SPAN><B><SPAN
lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">I/O
Completion Ports</SPAN></B><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">这是咱们最关心的:<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">在<SPAN
lang=EN-US>P179有一个</SPAN></SPAN><SPAN
style="COLOR: blue; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">操作概观</SPAN><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">:对着它,我来解释书上</SPAN><B><SPAN
lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">I/O
Completion Ports </SPAN></B><SPAN
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">的例子。<SPAN
lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//注意:一定要对着书,把下面用到的WIN32函数的每个参数的含义弄清楚,这很重要<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//――――――产生一个I/O
completion port<SPAN style="mso-spacerun: yes">
</SPAN></SPAN></B><B><SPAN lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">①</SPAN></B><B><SPAN
lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-tab-count: 1">
</SPAN></SPAN><SPAN lang=EN-US
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//构造一个I/O
completion port<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-tab-count: 1">
</SPAN></SPAN><SPAN lang=EN-US
style="COLOR: #993300; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">ghCompletionPort
</SPAN><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">=
CreateIoCompletionPort(<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-spacerun: yes">
</SPAN>INVALID_HANDLE_VALUE,<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63.75pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">NULL,<SPAN
style="mso-spacerun: yes"> </SPAN></SPAN><SPAN lang=EN-US
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//不使用任何port
<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63.75pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">0,<SPAN
style="mso-spacerun: yes">
</SPAN></SPAN><SPAN lang=EN-US
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-spacerun: yes"> </SPAN>//这个参数用于在线程间传递参数,此时设为空<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-spacerun: yes">
</SPAN>0<SPAN
style="mso-spacerun: yes">
</SPAN></SPAN><SPAN lang=EN-US
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-spacerun: yes"> </SPAN>//
使用默认的线程数<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63.75pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">);<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 63.75pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//――――――让它和一个文件handle产生关联<SPAN
style="mso-spacerun: yes"> </SPAN></SPAN></B><B><SPAN
lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">②</SPAN></B><B><SPAN
lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-tab-count: 1">
</SPAN></SPAN><SPAN lang=EN-US
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//将socket关联到</SPAN><SPAN
lang=EN-US
style="COLOR: red; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">①</SPAN><SPAN
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">产生的<SPAN
lang=EN-US>I/O completion
port,那么以后发生在这个socket<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt"><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//上的任何I/O操作,都由此I/O
completion port中的线程处理<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt"><SPAN
lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">CreateIoCompletionPort(
(HANDLE)newsocket, </SPAN><SPAN lang=EN-US
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//注意,这里是socket;原因见书P184<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt"><SPAN
lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-spacerun: yes"> </SPAN></SPAN><SPAN
lang=EN-US
style="COLOR: #993300; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">ghCompletionPort</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">,
</SPAN><SPAN lang=EN-US
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//指定的I/O
completion port</SPAN><SPAN lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt"><SPAN
lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-spacerun: yes">
</SPAN>(DWORD)</SPAN><SPAN lang=EN-US
style="COLOR: #ff6600; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">pKey</SPAN><SPAN
lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">,<SPAN
style="mso-spacerun: yes"> </SPAN></SPAN><SPAN
lang=EN-US
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//一个指针,指向自定义的结构<o:p></o:p></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt"><SPAN
lang=EN-US
style="COLOR: black; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><SPAN
style="mso-spacerun: yes">
</SPAN>0<SPAN
style="mso-spacerun: yes">
</SPAN></SPAN><SPAN lang=EN-US
style="COLOR: green; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">//
使用默认的线程数</SPAN><SPAN lang=EN-US
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -