使用 c++ async 进行并行编程

Posted

技术标签:

【中文标题】使用 c++ async 进行并行编程【英文标题】:Parallel programming with c++ async 【发布时间】:2016-12-30 15:54:39 【问题描述】:

有没有办法设置使用异步函数(从未来)可以创建的最大线程数? 我更喜欢使用 async/future.get 因为它可以转换为同步/生成多任务模型,这很常见 在有关算法的教科书中(即 Cormen)。我希望能够获得 T[p](使用 p 个处理器/线程完成程序的时间)。

【问题讨论】:

您可以将所有对 async 的调用放在一个类的方法中,如果对成员函数的调用次数高于您在构造实例时可以指定的某个限制,该方法将拒绝执行任何操作类的。如果您的程序达到或超过限制,您希望您的程序做什么? 快速而肮脏的解决方案:将信号量初始化为您希望能够同时进行的线程数。让您的线程程序等待该信号量。这并不能将您从创建线程的开销中解放出来,但至少任何额外的线程都会安静地旋转。 或者:有一个原子(优先级)队列,让池中的工作线程从队列中获取下一个任务,但您已经说过您宁愿进行同步/生成。 【参考方案1】:

很遗憾,没有。众所周知,std::async 对线程创建方式的控制非常有限。

您可以考虑改用 boost 线程池。这是boost asio 的一部分(有点反直觉),并使用io_service 对象,即使/如果您实际上并未将其用于 I/O。

这样可以很容易地控制使用的线程数,包括只使用一个。

当然,您可以从标准组件构建自己的线程池类。当然可能,但并非完全是微不足道的任务。

【讨论】:

以上是关于使用 c++ async 进行并行编程的主要内容,如果未能解决你的问题,请参考以下文章

C++ 并行编程中的“锁”难题

JavaScript / NodeJS真正并行吗?

c++多线程编程:实现标准库accumulate函数的并行计算版本

如何在 Python 中进行并行编程?

Swift 并行编程现状和展望 - async/await 和参与者模式

Manning新书C++并行实战,592页pdf,C++ Concurrency in Action