这道题目只从《编程之美》这本书出了之后,研究它的人不在少数,最近自己也是在快要毕业的阶段,所以拜读了这本书,并在网上看了很多其他的对此题的各种看法。
下面我主要是作为一种练习题一样,写了差不多的代码,并验证了各种解法。(下面是代码和贴图)
解法一:简单解法
Busy用可循环来实现,for(i=0;i<n;i++) ;
对应的汇编语言为
loop;
mov dx i ;将i置入dx寄存器
inc dx ;将dx寄存器加1
mov dx i ;将dx中的值赋回i
cmp i n ;比较i和n
j1 loop ;i小于n时则重复循环
我的cpu(双核)1.87GHZ 现代cpu每个时钟周期可执行两条以上的代码,取平均值2,于是
(1870 000 000*2)/5=744000000(循环/秒) 每秒可以执行循环744000000次
不能简单的取n=7440000000然后sleep(1000),如果让cpu工作1s,休息1s很可能是锯齿,先达到一个峰值然后跌入一个很低的占有率;所以我们睡眠时间改为10ms,10ms比较接近windows的调度时间,n=7440000。如果sleep时间选的太小,会造成线程频繁的唤醒和挂起,无形中增加了内核时间的不确定性因此代码如下:
#include "stdafx.h" #include<windows.h> int _tmain(int argc, _TCHAR* argv[]) { //50%.. //Thread 0 can only run on CPU 0. SetThreadAffinityMask(GetCurrentProcess(),0x00000001); while(true){ for(int i=0;i<744000000;i++); Sleep(10); } return 0; }
很显然,是个比较锯齿的样子。
后面还有很多比较难的解法,涉及的东西比较多,有机会再续。。。
还是把一篇好的文章附在下面,不多说了,个人觉得很是精彩http://blog.csdn.net/wesweeky/article/details/6402564