c++ - 多线程与多处理

标签 c++ multithreading parallel-processing multiprocessing

我是这种编程的新手,需要你的观点。

我必须构建一个应用程序,但我无法让它足够快地计算。我已经尝试过 Intel TBB,而且很好用,但是我没有使用过其他库。

在多处理器编程中,我正在阅读有关多线程的 OpenMP 和 Boost,但我不知道它们的优缺点。

在 C++ 中,与多处理器编程相比,多线程编程何时具有优势,反之亦然?哪一个最适合繁重的计算或启动许多任务...?当我们构建使用它们设计的应用程序时,它们的优缺点是什么?最后,哪个库最适合使用?

最佳答案

多线程就是这个意思,运行多个线程。这可以在单处理器系统或多处理器系统上完成。

在单处理器系统上,当运行多个线程时,实际观察到计算机同时执行多项操作(即多任务)是一种错觉,因为在幕后真正发生的是在单个 CPU 上执行时间分片的软件调度程序。因此,在任何给定时间只发生了一个任务,但调度程序在任务之间切换的速度足够快,因此您永远不会注意到有多个进程、线程等在争夺相同的 CPU 资源。

在多处理器系统上,时间片的需求减少了。时间片效应仍然存在,因为现代操作系统可能有数百个线程竞争两个或更多处理器,并且线程数与可用处理核心数之间通常没有一对一的关系。所以在某些时候,一个线程必须停止,另一个线程在两个线程共享的 CPU 上启动。这再次由操作系统的调度程序处理。话虽如此,对于多处理器系统,您可以同时发生两件事,这与单处理器系统不同。

最后,从某种意义上说,这两种范式确实有些正交,只要您想让两个或更多任务异步运行,就需要多线程,但是由于时间片,您不一定需要多处理器系统来实现这一点。如果您正在尝试运行多个线程,并且正在执行高度并行的任务(即尝试解决积分),那么是的,您可以在问题上投入的核心越多越好。您不一定需要线程和处理核心之间的一对一关系,但同时,您不希望剥离这么多线程,最终导致大量空闲线程,因为它们必须等待被安排在可用的 CPU 内核之一上。另一方面,如果您的并行任务需要一些顺序组件,即一个线程将等待另一个线程的结果才能继续,那么您可以使用某种类型的屏障或同步方法运行更多线程,所以需要空闲的线程没有使用 CPU 时间旋转,只有需要运行的线程在争夺 CPU 资源。

关于c++ - 多线程与多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6388031/

相关文章:

c++ - 在 C++ 中为基类和派生类声明 'virtual' 构造函数?

c++ - 在 C++ 中,当我们在基类中将一个函数设为纯虚函数时,那么在子类中再次将同一函数设为虚函数的必要性是什么?

ruby - 处理在 Ruby 线程中引发的异常

functional-programming - 哪些函数式语言实现允许线程并行运行?

java - 确定嵌套消费者完成情况

c++ - 编译后未定义的宏参数会发生什么?

c++ - 使用谷歌模拟模拟转换运算符 int()

java - 在 Java 的并行线程中写入文件的最佳方法是什么?

c++ - QTextStream 在 QThread::sleep() 之前不写入

PowerShell 7.0 如何计算分块读取的大文件的哈希和