C++ 多处理器Boost::线程?在一个处理器上运行的所有线程

C++ 多处理器Boost::线程?在一个处理器上运行的所有线程,c++,multithreading,boost,parallel-processing,boost-thread,C++,Multithreading,Boost,Parallel Processing,Boost Thread,我有一个令人尴尬的并行问题,我想在多个处理器上执行。我原以为boost::thread会自动将新线程发送到新处理器,但它们都在与父进程相同的核心上执行。是否可以让每个线程在不同的处理器上运行,或者我需要类似MPI的东西 我的怀疑是,boost::thread根本不是一个多处理器工具,我要求它做一些它不是为之设计的事情 编辑:我的问题归结为:为什么所有线程都在一个处理器上执行?有没有办法让boost::thread将线程发送到不同的处理器 以下是我的代码的相关示例: size_t lim=1000

我有一个令人尴尬的并行问题,我想在多个处理器上执行。我原以为
boost::thread
会自动将新线程发送到新处理器,但它们都在与父进程相同的核心上执行。是否可以让每个线程在不同的处理器上运行,或者我需要类似MPI的东西

我的怀疑是,
boost::thread
根本不是一个多处理器工具,我要求它做一些它不是为之设计的事情

编辑:我的问题归结为:为什么所有线程都在一个处理器上执行?有没有办法让
boost::thread
将线程发送到不同的处理器

以下是我的代码的相关示例:

size_t lim=1000;
std::deque<int> vals(lim);
std::deque<boost::thread *> threads;
int i=0; 
std::deque<int>::iterator it = vals.begin();
for (; it!=sigma.end(); it++, i++) {
  threads.push_back(new boost::thread(doWork, it, i));
  while (threads.size() >= maxConcurrentThreads) {
    threads.front()->join();
    delete threads.front();
    threads.pop_front();
  }
}
while(threads.size()) {
  threads.front()->join();
  threads.pop_front();
}

编辑:正如Martin James所建议的,问题在于doWork函数最初只有1000 int的加法。对于如此小的作业,调度线程比执行线程花费的时间更长,因此只使用一个处理器。使作业更长(添加10000000整数)会产生所需的行为。要点是:
boost::thread
默认情况下将使用多个内核,但是如果您的线程所做的工作少于调度线程,那么您将看不到多线程的任何好处


感谢大家帮助我理解这一点。

您总是加入队列中的第一个线程。如果这个线程需要很长时间,它可能是剩下的唯一线程。我想你想要的是在任何线程完成后启动一个新线程

我不知道为什么您只能获得一个有效的并发级别


在看了doWork函数之后,我认为它所做的工作非常少,因此它比开始一个线程所做的工作要少。试着用更多的工作量(1000倍)来运行它。

对,多线程和多处理是完全不同的概念,boost::thread支持前者。听起来像MPI。。。欢迎来到我的世界!我不认为这与MPI有任何关系,他只是把“多处理器”和“多核系统”混为一谈。@juanchopanza我理解你的意思是,
boost::thread
不能将每个线程发送到不同的内核。是吗?通常,你可以通过听来判断这样的事情是否有效。如果我加载8个100%CPU线程,CPU风扇会在几秒钟内加速。您是否将
deque
queue
混合使用?只有当
threads.size()>=maxConcurrentThreads
@megabyte1024时,代码才会开始连接,这并不重要,因为如果deque中的第一个线程比其他线程耗时更长,所有其他线程都将在第一个线程之前完成,并且一次运行的唯一线程是第一个线程。实际上,我的建议是使用线程池。它将为您处理所有这些。把1000个数字加在一起?该线程可能在创建第二个线程时完成,因此第二个线程可能会在同一个内核上运行,因为该内核已经设置了进程上下文。做些更重的工作!
void doWork(std::deque<int>::iterator it, int i) {
  int ret=0;
  int size = 1000; // originally 1000, later changed to 10,000,000
  for (int j=i; j<i+size; j++) {
    ret+=j;
  }
  *it=ret;
  return;
}