c++ - 如何在不同的核心(并行)上分别运行 4 个线程?

标签 c++ multithreading parallel-processing

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

我应该尝试自己安排线程,以便每个线程都在不同的内核上运行,还是应该让 OS Scheduler 来做?在我看来,我认为如果我强制它在不同的核心上运行每个线程会更快。我该怎么做?

这是我目前尝试过的:

#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 注意:

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

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

最佳答案

大功告成,无需安排任何事情。只要有多个处理器可用,您的线程就会在可用内核上同时运行。

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


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


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

关于c++ - 如何在不同的核心(并行)上分别运行 4 个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38962563/

相关文章:

c++ - 重载运算符后跟模板类型参数

c++ - 使用线程的 vector 和没有加速

hadoop - 临时挂起 hadoop 节点 - 后台 hadoop 集群

windows - `ProcessPoolExecutor` 在 Ubuntu 上工作,但在 Windows 10 上运行带有 Python 3.5.3 的 Jupyter 5.0.0 笔记本时失败并显示 `BrokenProcessPool`

c++ - Eigen 与 OpenMP : No parallelisation due to false sharing and thread overhead

python - Cython 并行读取文件并绕过 GIL

c++ - 模板编译

c++ - ostream 运算符重载 - 继承

c++ - 从一个稀疏矩阵中提取一个 block 作为另一个稀疏矩阵

c++ - 多线程变化需要更长的时间