我在 8 核处理器上运行 64 位 Windows 7。我运行了以下内容:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <process.h>
#include <ctime>
using namespace std;
int count = 0;
int t = time(NULL);
//poop() loops incrementing count until it is 300 million.
void poop(void* params) {
while(count < 300000000) {
count++;
}
cout<< time(NULL) - t <<" \n";
}
int _tmain(int argc, _TCHAR* argv[])
{
//_beginthread(poop, 0, NULL);
//_beginthread(poop, 0, NULL);
poop(NULL);
cout<<"done"<<endl;
while(1);
return 0;
}
我将结果与取消注释 beginThread 时的结果进行了比较。事实证明,单线程版本最快完成了这个!实际上,添加更多线程会使该过程花费更长的时间。计数 3 亿使该过程花费了 8 多秒,我认为这足以排除对 beginThread 的函数调用 + 其他小开销。
我做了一些研究,多线程进程变慢的一般结论是开销。但在这种情况下,无论我运行多个线程还是单个线程,变量计数(存在于数据段中,因为它是一个预先分配的变量 afaik)被访问的次数是相等的。所以基本上,开销(如果是开销问题)并不是因为访问全局变量的成本高于访问局部变量的成本。
查看我的任务管理器,单线程进程使用 13% 的 cpu(大约 1/8 个内核),添加线程会以大约 1/8 的增量增加 cpu 使用率。所以就cpu功率而言,假设任务管理器准确地描述了这一点,添加线程会使用更多的cpu。这进一步让我感到困惑..我如何使用更多的整体 cpu,具有单独的内核,但总体上需要更长的时间来完成任务?
TLDR:为什么会这样