问题来源于《编程之美》,那时我还只有单核CPU的电脑,书上的讨论问题就没有研究。今天拿出来在多核CPU上重做一下,加入下面这行代码就搞定了。貌似不需要GetProcessorInfo()这个函数,另外这个函数也只能在Windows Server版本中才支持。

SetThreadAffinityMask(GetCurrentThread(), 0x00000001);

完整代码为:

#include <Windows.h>
#include <stdlib.h>
#include <math.h>
// COUNT * SPLIT = 2
const int COUNT = 200;
const double SPLIT = 0.01;
const double PI = 3.1415926;
const int HALF_INTERVAL = 200;
int main()
{
    SetThreadAffinityMask(GetCurrentThread(), 0x00000001);
    unsigned int busySpan[COUNT];
    unsigned int idleSpan[COUNT];

    // From 0 to 2PI is a cycle
    double radian = 0.0;
    for (int i = 0; i < COUNT; i++)
    {
        busySpan[i] = (HALF_INTERVAL + sin(PI * radian) * HALF_INTERVAL);
        idleSpan[i] = HALF_INTERVAL * 2 - busySpan[i];
        radian += SPLIT;
    }
    int startTime = 0;
    int j = 0;
    while (true)
    {
        j = j % COUNT;
        startTime = GetTickCount();
        while ((GetTickCount() - startTime) <= busySpan[j]);
        Sleep(idleSpan[j]);
        j++;
    }
    return 0;
}

显示的结果为:

enter image description here

如果去掉那行代码,则会是下面这个样子,通过多次试验发现大概会分配到2个核心上,而不是平均分到4个上面。具体原理不详。

enter image description here

以前单核CPU的结果为:

enter image description here

结论:

如果就在一只羊身上薅[hāo]羊毛,很容易被发现!