Rob*_*opp 21 c++ multithreading asynchronous
我是这个概念的新手.这些是相同或不同的东西吗?有什么不同?我真的很喜欢能够同时运行两个进程的想法,例如,如果我有几个大文件加载到我的程序中,我希望尽可能多地同时加载它们而不是一次等待一个.当使用大文件(例如wav文件)时,将它分成几块并一次处理几个块然后将它们重新组合在一起会很棒.我想研究一下如何做这类事情?
编辑:另外,我知道在多核处理器上使用多个核心适合这里,但显然异步编程并不一定意味着你使用多核?如果您没有多个核心可以利用,为什么要这样做呢?
Mik*_*son 31
他们是相关但不同的.
线程通常是指最简单的多线程形式,即当你有一小组线程时,每个线程都需要执行特定的任务,或者可以同时运行.例如,这可能是一个CPU
应用程序,您可能有一个线程处理元素的绘制,另一个线程响应鼠标单击等事件,另一个线程执行一些后台处理.但是线程也可以更普遍地指代任何类型的多线程(即,"线程"是所有多线程的基本构造,它是执行的线程).当有一组线程各自做自己的事情的想法被采取极端时,我们通常开始谈论基于代理的方法.
基于任务的方法是指软件工程中的一种特定策略,从抽象的角度来说,您可以动态创建要完成的"任务",这些任务由任务管理器选取,任务管理器将任务分配给可以完成它们的线程.这更像是一种软件架构.这里的优点是整个程序的执行是一系列被中继的任务(任务A完成 - >触发任务B,当任务B和任务C都完成时 - >触发任务D等等),而不是必须编写一个一个接一个地执行每个任务的大功能或程序.当不清楚哪些任务比其他任务花费更多时间,以及任务只是松散耦合时,这提供了灵活性.这通常通过线程池(等待分配任务的线程)和一些消息传递接口(MPI)来实现,以传递数据和任务"合同".
异步编程并不直接涉及一种多线程程序程序,尽管它们经常相关联(并且很好地协同工作).一个同步程序可能会有点像这样:"做这个任务","等到完成","做一些结果","继续做其他事情".一个异步程序可能更像这样:"我将需要这个任务的结果来对结果做一些事情",并且"现在,我将转向别的东西,并期待以后的结果(等我必须)".但请注意,"异步"是一个非常广泛的概念,但它总是涉及"只要告诉我什么时候完成"而不是传统的"现在就做!".这不需要多线程,在这种情况下它只是一个软件设计选择(通常涉及回调函数和类似的事情,以提供异步结果的"通知").但是,显然,对于多个线程,它会变得更强大,因为您可以在期望某些异步任务的结果时执行其他操作.从极端的角度来看,它可以成为一个更完整的架构,就像基于任务的方法(这是一种异步编程技术).
我认为你所描述的东西更多地与另一个概念相对应:并行计算(或并行处理).这种方法更多的是将大型处理任务拆分为较小的部分并并行处理所有部分,然后组合结果.您应该查看OpenMP或CPU
(对于GPGPU)这样的库.
但显然异步编程并不一定意味着你使用多个内核?
是的,正如我所说的,异步编程并不一定涉及任何同时发生的事情(多线程),但它归结为软件设计选择,而且往往是一个好的选择,我可能会补充说.然后,还有其他使用"异步"一词的上下文,例如异步I/O,这是一个完全不同的概念,与多线程无关.
如果您没有多个核心可以利用,为什么要这样做呢?
如果您没有多个内核,多线程的优势与性能没有多大关系(在每秒处理更多数字的意义上),而是在设计上具有灵活性并且能够重用"等待时间" (例如,不要"阻止"处理,因为您需要一些时间等待文件I/O或网络I/O).此外,在"线程化"(如上所述)的情况下,动机只是让不同的任务同时(或似乎)运行.但你是正确的,在多核之前CPU
,没有那么多的激励去做多线程,因为收益往往不能证明开销是合理的.
归档时间: |
|
查看次数: |
18375 次 |
最近记录: |