⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_65988.htm

📁 vc
💻 HTM
字号:
<p>
序号:65988 发表者:badboy 发表日期:2003-12-21 18:21:19
<br>主题:我发现在多线程里Sleep(0);函数有时候能起到至关重要的重用!
<br>内容:/*<BR>&nbsp;&nbsp;不信吗?我给您举个例子!&nbsp;&nbsp;下面这个程序竟然只用了sleep()函数就可以控制两个线程出现特定的同步顺序<BR>thread1-&gt;thread2-&gt;thread1-&gt;thread2……&nbsp;&nbsp;<BR>&nbsp;&nbsp; 而实际上,我是准备用一些特定代码实现两个线程同步的。见最下面的程序!<BR>*/<BR>#include &#34;iostream.h&#34;<BR>#include &lt;stdio.h&gt;<BR>#include &#34;process.h&#34;<BR>#include &#34;windows.h&#34;<BR>#include &lt;conio.h&gt;<BR>int _k;&nbsp;&nbsp; <BR>CRITICAL_SECTION&nbsp;&nbsp;_cs; <BR>int e=0; <BR>void thread1(void*) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(;!e;)&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&amp;_cs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++_k; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;_k&lt;&lt;&#34;&nbsp;&nbsp;&#34;&lt;&lt;&#34;this num&nbsp;&nbsp;is produecd by thread1&#34;&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;Sleep(0);&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//让前面的这个函数工作一下,保证让你吓一跳!<BR>//我还没有采取任何同步的措施,这个程序就已经开始出现了<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//thread1-&gt;thread2-&gt;thread1-&gt;thread2……&nbsp;&nbsp;这个特定的线程同步顺序?是怎么出现的?<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这个Sleep(0)函数到底搞了什么小动作?<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&amp;_cs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;_endthread();<BR>}<BR><BR>void thread2(void*) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(;!e;) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++_k; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(1000);&nbsp;&nbsp;&nbsp;&nbsp;//这里的时间可以随便改,甚至可以为0 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;_k&lt;&lt;&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;&lt;&lt;&#34;this num is produced by thread2&#34;&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;_endthread();<BR>}<BR><BR>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;InitializeCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;_beginthread(thread1,1024,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;_beginthread(thread2,1024,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;e=getch();&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;DeleteCriticalSection(&amp;_cs);&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;_endthread();<BR>}<BR><BR>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;InitializeCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;_beginthread(thread1,1024,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;_beginthread(thread2,1024,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;e=getch();&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;DeleteCriticalSection(&amp;_cs);&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}<BR>/*<BR>下面的这个程序才用了一些特定代码可以实现两个线程thread1-&gt;thread2-&gt;thread1-&gt;thread2……特定同步顺序。您一分析,就能确定下面这个程序肯定能实现两个线程的精确的交替执行,可上面那个程序凭什么呀? */<BR>#include &#34;iostream.h&#34;<BR>#include &lt;stdio.h&gt;<BR>#include &#34;process.h&#34;<BR>#include &#34;windows.h&#34;<BR>#include &lt;conio.h&gt;<BR>int _k; <BR>CRITICAL_SECTION&nbsp;&nbsp;_cs; <BR>int e=0; <BR>void thread1(void*)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(;!e;)&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(;;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&amp;_cs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_k%2==0)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++_k;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&amp;_cs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;_k&lt;&lt;&#34;&nbsp;&nbsp;&#34;&lt;&lt;&#34;this num&nbsp;&nbsp;is produecd by thread1&#34;&lt;&lt;endl;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;_endthread(); <BR>}<BR><BR>void thread2(void*)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(;!e;)&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(;;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(_k%2 != 0)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++_k;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;_k&lt;&lt;&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;&lt;&lt;&#34;this num is produced by thread2&#34;&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp; _endthread(); <BR>}<BR><BR>int main()<BR>{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;InitializeCriticalSection(&amp;_cs);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _beginthread(thread1,1024,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;_beginthread(thread2,1024,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;e=getch();&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;DeleteCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}<BR><BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:林建华 回复日期:2003-12-22 10:05:34
<br>内容:当调用Sleep函数的时候,程序会出让cpu时间给其他程序,里面的参数是几就是几毫秒的cpu时间,如果是0的话就把当前使用的时间片出让
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zzjhsj 回复日期:2003-12-22 11:12:42
<br>内容://我怀疑这是window动态优先级调度导致的问题,对Sleep的调用<BR>//取消了系统对线程优先级的动态提升;如果每个线程开始都调用<BR>//SetThreadPriorityBoost(::GetCurrentThread(),TRUE);<BR>//那么即使没有一个sleep,程序的结果依然相同<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:红苹果 回复日期:2003-12-22 19:26:53
<br>内容:我试了,有sleep和没有sleep函数时,运行结果有所不同,但并不时你说的thread1-&gt;thread2-&gt;thread1-&gt;thread2……&nbsp;&nbsp;<BR>&nbsp;&nbsp; 有时是thread1-&gt;thread1-&gt;thread2-&gt;thread2……&nbsp;&nbsp;<BR>有时又是thread1-&gt;thread1-&gt;thread2-&gt;thread2-&gt;thread1-&gt;thread2-&gt;thread2-&gt;thread1...<BR>我认为执行了sleep,影响到了时间片的执行,当机器的速度巧合时,正好出现了交替执行,但并不时必然。你换台不同速度的机器试试。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dsadsdas 回复日期:2003-12-22 20:44:27
<br>内容:我告诉你凭什么吧,凭运气!<BR>错的就是错的,不是你碰巧对了几次就对的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-12-23 00:02:50
<br>内容:&nbsp;&nbsp;现在我不考虑Sleep()里的数是不是零了,只要程序里两个线程里在EnterCriticalSection(&amp;_cs); LeaveCriticalSection(&amp;_cs);<BR>之间有Sleep()这个函数,不管参数是多少,我这台机器保证的结果保证是:<BR>1&nbsp;&nbsp;this num&nbsp;&nbsp;is produecd by thread1<BR>2&nbsp;&nbsp;&nbsp;&nbsp;this num is produced by thread2<BR>3&nbsp;&nbsp;this num&nbsp;&nbsp;is produecd by thread1<BR>4&nbsp;&nbsp;&nbsp;&nbsp;this num is produced by thread2<BR>5&nbsp;&nbsp;this num&nbsp;&nbsp;is produecd by thread1<BR>6&nbsp;&nbsp;&nbsp;&nbsp;this num is produced by thread2<BR>7&nbsp;&nbsp;this num&nbsp;&nbsp;is produecd by thread1<BR>8&nbsp;&nbsp;&nbsp;&nbsp;this num is produced by thread2<BR>…………………………………………<BR>…………………………………………<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;我试验了N回,决不是几次。而且将CPU频率又667超频到833,结果都一样。我感觉这不应该算是巧合。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 本人机器较烂! 赛羊667 xp 系统 <BR>&nbsp;&nbsp;我很郁闷!身边没有别的机器!<BR>  目前,我觉得二楼的意见可以接受。不过,那个SetThreadPriorityBoost(::GetCurrentThread(),TRUE);怎么用啊?应该是放到两个线程里吧?不过,结果更有意思,开始部分的顺序不确定,直到后来两个线程才开始循环交替。<BR><BR><BR>#include &#34;iostream.h&#34;<BR>#include &lt;stdio.h&gt;<BR>#include &#34;process.h&#34;<BR>#include &#34;windows.h&#34;<BR>#include &lt;conio.h&gt;<BR>int _k;&nbsp;&nbsp; <BR>CRITICAL_SECTION&nbsp;&nbsp;_cs; <BR>int e=0; <BR>void thread1(void*) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;SetThreadPriorityBoost(::GetCurrentThread(),TRUE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(;!e;)&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&amp;_cs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Sleep(23);&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++_k; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;_k&lt;&lt;&#34;&nbsp;&nbsp;&#34;&lt;&lt;&#34;this num&nbsp;&nbsp;is produecd by thread1&#34;&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&amp;_cs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;_endthread();<BR>}<BR><BR>void thread2(void*) <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;SetThreadPriorityBoost(::GetCurrentThread(),TRUE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(;!e;) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnterCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Sleep(64); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++_k; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;_k&lt;&lt;&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;&lt;&lt;&#34;this num is produced by thread2&#34;&lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeaveCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;_endthread();<BR>}<BR><BR>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;InitializeCriticalSection(&amp;_cs); <BR>&nbsp;&nbsp;&nbsp;&nbsp;_beginthread(thread1,1024,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;_beginthread(thread2,1024,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;e=getch();&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;DeleteCriticalSection(&amp;_cs);&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:dr0 回复日期:2003-12-23 00:11:53
<br>内容:the OS will reschedule the other threads if you call Sleep() to give up the current thread's time slice.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

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