我有一个多线程的应用程序,处理一个非常大的数据文件。在窗口7上工作得很好,代码全部是C++,使用的是跨平台多线程的库。当我在我的英特尔i3任务管理器上的windows下运行它时,会显示所有四个内核都与限制值挂钩,这就是我想要的。使用g++ubuntu/vmware工作站编译相同的代码-启动的线程数相同,但所有线程都在一个内核上运行(据我所知-任务管理器只显示一个内核繁忙)。
我将深入研究pthreads调用——也许我错过了一些默认设置——但是如果有人知道的话,我想听听,我可以提供更多信息-
更新:我确实设置了vmware以查看所有四个核心,/proc/cpuinfo显示了四个核心
更新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;
}

最佳答案

我把你的密码改了一点。我将numCores = strtol(&argv[1][2], NULL, 10);改为numCores = strtol(&argv[1][0], NULL, 10);以使其在linux下工作,方法是调用./core 4可能是在核心数前面传递某些内容,或者因为type_char是每个字符3字节?不太熟悉窗户。更进一步的是,由于我不能只用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验证了它,希望它有帮助。:)我使用4个Cores运行专用的Debian SID x86_64,以防您感到疑惑。

关于linux - 如何使多线程应用程序使用VMWare下Ubuntu上的所有内核?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6488432/

10-16 20:33