多线程与多处理

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

我不得不建立一个应用程序,但我无法让它计算得足够快。 我已经尝试过英特尔TBB,它很容易使用,但我从未使用过其他库。

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

在C ++中,与多处理器编程相比,何时多线程编程更有优势?反之亦然?哪种方法最适合大量计算或启动许多任务? 当我们构建与他们一起设计的应用程序时,他们有什么优点和缺点? 最后,哪个库最适合与?


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

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

在多处理器系统上,时间片的需求减少了。 时间切片效应仍然存在,因为现代操作系统可能会有数百个线程争夺两个或更多处理器,并且线程数量与可用处理内核数量之间通常不存在1对1关系。 所以在某些时候,一个线程将不得不停止,另一个线程在两个线程共享的CPU上启动。 这又由操作系统的调度程序处理。 这就是说,使用多处理器系统,您可以同时发生两件事情,与单处理器系统不同。

最后,这两种模式实际上有点正交,因为无论何时想要有两个或多个任务异步运行,您都需要多线程,但由于时间片化,您不一定需要多处理器系统才能完成那。 如果你正在尝试运行多个线程,并且正在执行高度并行的任务(即试图解决一个整数),那么是的,你可以抛出的核心越多越好。 您不一定需要线程和处理内核之间的1对1关系,但同时,您不希望分离出太多的线程,最终导致大量空闲线程,因为它们必须等待安排在其中一个可用的CPU内核上。 另一方面,如果你的并行任务需要一些顺序组件,也就是说,一个线程将在另一个线程继续运行之前等待其结果,那么你可以使用某种类型的屏障或同步方法运行更多的线程,需要空闲的线程不会使用CPU时间旋转,只有需要运行的线程才能争夺CPU资源。


我相信应该在@Jason的最佳答案中加入一些重要的观点。

首先,多线程即使在单个处理器上也不总是假象 - 有些操作不涉及处理器。 这些主要是I / O - 磁盘,网络,终端等。这种操作的基本形式是阻塞同步的 ,即你的程序一直等到操作完成然后继续。 在等待时,CPU切换到另一个进程/线程。

如果您在此期间可以做任何事情(例如,在等待用户输入的背景计算,提供另一个请求等时),您基本上有两种选择:

  • 使用异步I / O :你调用一个非阻塞的I / O,并提供一个回调函数,告诉它“完成后调用这个函数”。 调用立即返回,I / O操作在后台继续。 你继续与其他的东西。

  • 使用多线程 :您有针对每种任务的专用线程。 当一个人等待阻塞I / O呼叫时,另一个继续。

  • 这两种方法都是难以编程的范例,每种方法都有其优点和缺点。

  • 对于异步I / O,程序逻辑的逻辑不太明显,难以跟踪和调试。 但是,您可以避免线程安全问题。
  • 与线程,challange是编写线程安全的程序。 线程安全缺陷是很难重现的令人讨厌的错误。 过度使用锁定实际上会导致降级,而不是提高性能。
  • (来到多处理)

    多线程技术在Windows上很流行,因为在Windows上操作进程非常繁重(创建一个进程,上下文切换等),而不是轻量级的线程(至少在我使用Win2K的时候就是这种情况)。

    在Linux / Unix上,进程要轻得多。 另外,Linux上的(AFAIK)线程实际上是作为一种内部进程实现的,因此线程与进程的上下文切换没有任何好处。 但是,您需要使用某种形式的IPC(进程间通信),作为共享内存,管道,消息队列等。

    在更简洁的笔记中,看看SQLite FAQ,它声明“线程是邪恶的”! :)


    回答第一个问题:最好的方法是在你的代码中使用多线程技术,直到你没有给你足够的好处。 假设操作系统将处理委派给多个处理器(如果它们可用)。

    如果您实际上正在处理多线程不够的问题,即使使用多个处理器(或者如果您在不使用多处理器的操作系统上运行),那么您也可能担心发现如何获得更多功耗。 这可能意味着将整个网络产卵到其他机器。

    我没有使用过TBB,但我使用了IPP,并发现它效率高,设计良好。 Boost是便携式的。

    链接地址: http://www.djcxy.com/p/64513.html

    上一篇: Multithreading vs multiprocessing

    下一篇: What exactly is LLVM?