线程与基于任务的对比与异步编程

时间:2013-12-06 21:51:43

标签: c++ multithreading asynchronous

我是这个概念的新手。这些是相同或不同的东西吗?有什么不同?我真的很喜欢能够同时运行两个进程的想法,例如,如果我有几个大文件加载到我的程序中,我希望尽可能多地同时加载它们而不是一次等待一个。当使用大文件(例如wav文件)时,将它分成几块并一次处理几个块然后将它们重新组合在一起会很棒。我想研究一下如何做这类事情?

编辑:另外,我知道在多核处理器上使用多个核心适合这里,但显然异步编程并不一定意味着你使用多核?如果没有多个核心可以利用,为什么要这样做?

2 个答案:

答案 0 :(得分:31)

它们是相关但不同的。

线程通常是指最简单的多线程形式,即当你有一小组线程时,每个线程都需要执行特定的任务,或者可以从同时运行中获益。例如,这可能是一个GUI应用程序,您可能有一个线程处理元素的绘制,另一个线程响应鼠标单击等事件,另一个线程执行一些后台处理。但是线程也可以更普遍地指代任何类型的多线程(即,“线程”是所有多线程的基本构造,它是执行的线程)。当有一组线程各自做自己的事情时,我们通常开始讨论Agent-based approach

基于任务的方法是指软件工程中的一种特定策略,在抽象的术语中,您可以动态创建要完成的“任务”,这些任务由任务管理器选取,任务管理器将任务分配给可以完成的线程他们。这更像是一种软件架构。这里的优点是整个程序的执行是一系列被中继的任务(任务A完成 - >触发任务B,当任务B和任务C都完成时 - >触发任务D等等),而不是必须编写一个一个接一个地执行每个任务的大功能或程序。当不清楚哪些任务比其他任务花费更多时间,以及任务只是松散耦合时,这提供了灵活性。这通常使用thread-pool(等待分配任务的线程)和一些message-passing interface (MPI)来实现数据和任务“合同”。

异步编程并不直接引用一种多线程程序程序,尽管它们经常相关联(并且可以很好地协同工作)。一个同步程序可能有点像这样:“做这个任务”,“等到完成”,“做一些结果”,然后“继续做其他事情”。一个异步程序可能会更像这样:“我将需要这个任务的结果来对结果做一些事情”,并且“现在,我将转向别的东西,并期待以后的结果(等我必须)“。但请注意,“异步”是very broad concept,但它总是涉及“只要告诉我何时完成”而不是传统的“现在就做”!这不需要多线程,在这种情况下它只是一个软件设计选择(通常涉及回调函数和类似的东西,以提供异步结果的“通知”)。但是,显然,对于多个线程,它会变得更强大,因为您可以在期望某些异步任务的结果时执行其他操作。从极端的角度来看,它可以成为一个更加全面的架构,就像基于任务的方法(这是一种异步编程技术)。

我认为你所描述的东西更多地与另一个概念相对应:Parallel Computing(或并行处理)。这种方法更多的是将大型处理任务拆分为较小的部分并并行处理所有部分,然后组合结果。您应该查看OpenMPOpenCL / CUDA等库(GPGPU)。

  

但显然异步编程并不一定意味着您正在使用多个内核?

是的,正如我所说,异步编程并不一定涉及任何同时发生的事情(多线程),但它可归结为软件设计选择,而且往往是一个好的选择,我可能会补充说。然后,还有其他使用“异步”一词的上下文,例如异步I / O,这是一个完全不同的概念,与多线程无关。

  

如果您没有多个核心可以利用,为什么要这样做?

如果您没有多个内核,多线程的优势与性能无关(在每秒处理更多数字的意义上),而是在设计上具有灵活性并且能够重用“等待时间“(例如,不要”阻止“处理,因为您需要一些时间等待文件I / O或网络I / O)。此外,在“线程化”(如上所述)的情况下,动机只是让不同的任务同时(或似乎)运行。但是你在多核CPU之前是正确的,没有那么多激励去做多线程,因为收益往往不能证明开销是合理的。

答案 1 :(得分:1)

我认为一般来说,所有这些都与设计相关,而不是与语言相关。同样适用于多核编程。

为了反映Jim,不仅是文件加载方案。通常,您需要将整个软件设计为同时运行,以便感受多线程,基于任务或异步编程的真正好处。

尝试从宏大的角度来看待事物。了解特定示例的全部建模,并了解如何实现这些方法。很容易看出差异,并帮助了解何时何地使用它。