Kno*_*abe 19 c++ multithreading c++11 stdasync
C++标准的每个[futures.async]/3项目1,当一个函数与启动策略一起f传递时,将"运行"就像在新的执行线程中一样".std::asyncstd::launch::asyncf
鉴于它f可以做任何事情,包括无限循环和永久阻塞,一个实现如何提供在f自己的线程上运行而不实际在自己的线程上运行它的行为?也就是说,一个实现如何利用标准提供的"仿佛"摆动空间?
看看这里和这里出现的C++ refs ,似乎 " 似乎 "的目标是让库实现者有一定程度的自由.例如,它说
好像由std :: thread(std :: forward(f),std :: forward(args)...)生成,除非函数f返回值或抛出异常,它将存储在共享状态中可以通过std :: future访问异步返回给调用者.
在第一个来源,和
好像一个线程对象是用fn和args作为参数构造的,并且访问返回的future的共享状态会加入它
在第二.因此看起来行为类似于行为,std::thread但可能以不同的方式实现.这很有趣,因为你在这里引用的短语执行是可以区分的std::thread.不过,这似乎是两个来源理解为,如果这种方式.
另一种选择可能是,如FrançoisAndrieux所建议的那样,允许使用线程池,如第一个来源所示:
模板函数async异步运行函数f(可能在一个单独的线程中,它可能是线程池的一部分)
我可以想到的一些方法可以f在新线程上运行"好像"而不实际执行,如果f实际上不使用与其他线程共享的任何状态; 那么实现可以将它作为一个单独的进程运行(因为它不需要共享内存空间)它也可以只在另一个函数调用上在主线程上运行它(如果它可以证明f它不会阻塞或具有可观察的一面)以这种方式运行会产生不同的效果).它也可以安排在现有(但空闲)的线程(线程池)上运行.
如果你想傻了,我想你也可以考虑不运行的概念f 可言,因为没有什么时候新的线程将被安排由操作系统来运行的保证,所以一个邪恶的实施可能只是说,操作系统从不调度除主线程之外的任何线程,因此根本不运行f等同于在新线程上调度它.当然这是愚蠢/愚蠢的,没有理智的实现会做到这一点 - 但理论上语言允许这样一个退化的实现(我认为).
小智 5
此解决方案的优势在于您在多线程世界中针对特定角色进行了优化实施.由于我参与了软件更新程序,我将使用这样的例子.出于优化原因,您可以致电:
std::thread::hardware_concurrency();
Run Code Online (Sandbox Code Playgroud)
您将收到:
返回实现支持的并发线程数.
假设您的结果相等4.您希望并行执行更新.主要线程是监视期货清单(左边3个),不时检查是否完成,如果完成,则从待办事项列表中执行下一个操作.例如,如果您要更新不同类型的存储器,例如1-FileSystem,2-EEPROM,3-NOR存储器或类似的东西,那么利润就是这样.没有延迟检查循环没有利润,所以你想在检查之间给第4个线程一个任务.您正在编写正在挖掘比特币50毫秒的函数:)并且您在检查之间将其触发为延迟.
然后如你所说,我们有:
标准提供的"仿佛"摆动空间的优势