我有一个处理非常大的数据文件的多线程应用程序。在Window 7上运行良好,代码全部是C ++,使用pthreads库进行跨平台多线程。当我在英特尔i3上在Windows下运行它时 - 任务管理器显示所有四个核心都与限制挂钩,这就是我想要的。使用g ++ Ubuntu / VMWare工作站编译相同的代码 - 启动相同数量的线程,但所有线程都在一个核心上运行(据我所知 - 任务管理器只显示一个核心忙)。
我要潜入pThreads电话 - 也许我错过了一些默认设置 - 但如果有人有任何想法,我想听听它们,我可以提供更多信息 -
更新:我设置VMWare以查看所有四个核心,/ proc / cpuinfo显示4个核心
更新2 - 只是写了一个简单的应用程序来显示问题 - 也许它只是VMWare? - 那里的任何Linux原生都想尝试看看这实际上是否会加载多个内核?要在Windows上运行,您需要pThread库 - 可以轻松下载。如果有人能提出比printf更强大的cpu,请继续!
#ifdef _WIN32
#include "stdafx.h"
#endif
#include "stdio.h"
#include "stdlib.h"
#include "pthread.h"
void *Process(void *data)
{
long id = (long)data;
for (int i=0;i<100000;i++)
{
printf("Process %ld says Hello World\n",id);
}
return NULL;
}
#ifdef _WIN32
int _tmain(int argc, _TCHAR* argv[])
#else
int main(int argc, char* argv[])
#endif
{
int numCores = 1;
if (argc>1)
numCores = strtol(&argv[1][2],NULL,10);
pthread_t *thread_ids = (pthread_t *)malloc(numCores*sizeof(pthread_t));
for (int i=0;i<numCores;i++)
{
pthread_create(&thread_ids[i],NULL,Process,(void *)i);
}
for (int i=0;i<numCores;i++)
{
pthread_join(thread_ids[i],NULL);
}
return 0;
}
答案 0 :(得分:0)
我改变了你的代码。我将numCores = strtol(&argv[1][2], NULL, 10);
更改为numCores = strtol(&argv[1][0], NULL, 10);
以使其在Linux下工作,方法是调用./core 4
,也许你在核心数量前传递内容,或者因为每个字符的类型_TCHAR是3byte?不熟悉windows ..更进一步,因为我不能仅用printf来强调CPU,我也改变了一点处理。
void *Process(void *data)
{
long hdata = (long)data;
long id = (long)data;
for (int i=0;i<10000000;i++)
{
printf("Process %ld says Hello World\n",id);
for (int j = 0; j < 100000; j++)
{
hdata *= j;
hdata *= j;
hdata *= j;
hdata *= j;
hdata *= j;
hdata *= j;
hdata *= j;
hdata *= j;
hdata *= j;
hdata *= j;
hdata *= j;
...
}
}
return (void*)hdata;
}
现在当我运行gcc -O2 -lpthread -std=gnu99 core.c -o core && ./core 4
你可以看到所有4个线程都运行在4个不同的核心上,很可能它们一次从核心交换到核心,但是所有4个核心都在加班。
core.c: In function ‘main’:
core.c:75:50: warning: cast to pointer from integer of different size [-Wint-to-pointer- cast]
Starting 4 threads
Process 0 says Hello World
Process 1 says Hello World
Process 3 says Hello World
Process 2 says Hello World
我用htop
验证了它希望它有所帮助.. :)我运行专用的Debian SID x86_64和4个字符,以防你想知道。