如何在不同的核心上运行 4 个线程(并行性)?

新手上路,请多包涵

我想并行( 不是同时)运行1四个线程做完全独立的事情。我是并行的新手,我有几个问题。我之所以要这样做是因为 性能对我来说真的很重要。我正在使用 4 核 Windows 机器,并且在 Visual Studio Community 2015 中使用 C++。

我应该尝试自己安排线程,以便每个线程都在不同的核心上运行,还是应该让操作系统调度程序来执行此操作?在我看来,我认为如果我强制它在不同的核心上运行每个线程会更快。我怎样才能做到这一点?

这是我到目前为止所尝试的:

 #include <thread>
void t1(){//do something}
void t2(){//do something}
void t3(){//do something}
void t4(){//do something}

int main(){
   std::thread thread1(t1);
   std::thread thread2(t2);
   std::thread thread3(t3);
   std::thread thread4(t4);

   t1.join();
   t2.join();
   t3.join();
   t4.join();
}

我知道 join() 阻塞线程直到它完成,但我不确定它是否并行运行线程?我的代码是 同时还是并行 执行线程?


1 注意:

并发 本质上是同时执行两个任务。这可能意味着一个在短时间内“暂停”,而另一个正在处理中。

并行 性要求在特定时刻至少有两个进程/任务正在积极执行。

原文由 mata 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 680
1 个回答

你已经完成了,不需要安排任何事情。只要有多个处理器可用,您的线程就会在可用内核上同时运行。

如果可用的处理器少于 4 个,比如 2 个,您的线程将以交错方式运行,在任何给定时间最多运行 2 个。


ps 自己也很容易体验 - 只需制作 4 个无限循环并在 4 个不同的线程中运行它们。您将看到正在使用 4 个 CPU。


免责声明:当然,“在幕后”,操作系统 正在 为您完成调度。因此,您依赖于 OS 中内置的调度程序的质量来实现并发性。内置在运行 C++ 应用程序的操作系统中的调度程序的公平性超出了 C++ 标准,因此无法保证。但实际上,尤其是在学习编写并发应用程序时,大多数现代操作系统将在线程调度方面提供足够的公平性。

原文由 rustyx 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题