等待多重未来?

2023-12-29

我想运行相同类型的任务(工作线程),但一次不超过一定数量的任务。当任务完成时,其结果是新任务的输入,然后可以启动该新任务。

有没有什么好的方法可以在 C++11 中使用异步/未来范例来实现这一点?

乍一看,它看起来很简单,您只需使用以下命令生成多个任务:

std::future<T> result = std::async(...);

然后运行result.get()获取任务的异步结果。

然而,这里的问题是未来的对象必须存储在某种队列中并一一等待。不过,可以一遍又一遍地迭代未来的对象,检查它们是否已准备好,但由于不必要的 CPU 负载,这不是所希望的。

是否有可能以某种方式等待any未来从给定的集合中准备好并获得其结果?

到目前为止,我能想到的唯一选择是没有任何异步/未来的老式方法。具体来说,生成多个工作线程,并在每个线程结束时将其结果推送到互斥锁保护的队列中,通过条件变量通知等待线程该队列已更新为更多结果。

还有其他更好的异步/未来解决方案吗?


C++11 中的线程支持只是第一步,而std::future太棒了,它还不支持多重等待。

然而,你可以相对低效地伪造它。您最终为每个创建一个辅助线程std::future(哎呀,非常昂贵),然后收集他们的“这个future已准备好”进入同步的多生产者单消费者消息队列,然后设置一个消费者任务来调度给定的事实std::future准备好了。

The std::future在这个系统中并没有添加太多功能,并且让任务直接声明它们已准备好并将其结果粘贴到上述队列中会更高效。如果您走这条路,您可以编写与以下模式匹配的包装器std::async or std::thread,并返回一个std::future就像代表队列消息的对象。这基本上涉及重新实现并发库的一部分。

如果你想留下来std::future,你可以创建shared_futures,并且让每个相关任务依赖于一组shared_futures:即,无需中央调度程序即可完成。这不允许诸如中止/关闭消息之类的事情,我认为这对于强大的多线程任务系统至关重要。

终于可以等了C++2x http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4107.html,或者每当并发TS被折叠到标准中,为你解决问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

等待多重未来? 的相关文章

  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 通过 CLI 的 AWS DynamoDB put-item 类型无效(unicode v. dict)

    我想通过命令行向我的 DynamoDB 表添加一个项目 但遇到了类型错误 我尝试添加的数据非常简单 id 1 我运行的命令同样简单 aws dynamodb put item table name my table item id 1 我收
  • required_if Laravel 5 验证

    我有用户可以填写的表格来出售他们的房屋 对于其中一项输入 用户必须选择 出售 或 出租 如果是出售 则会出现两个价格输入字段 如果是出租 则会出现基于 jQuery 的其他价格输入字段 我的问题是我希望价格字段是必需的 但是例如 如果我选择
  • 通过 SOS 调查 CLR

    目前 我正在深入研究 CLR 并尝试找到托管对象的适当大小 我有两种简单的类型 XClass class XClass public XStruct StructField new XStruct public int IntField p
  • 为什么在 javascript 中列出类的实际构造函数很重要

    我正在阅读 javascript 花园http bonsaiden github com JavaScript Garden http bonsaiden github com JavaScript Garden 关于 javascript
  • 为什么我的 OBJ 解析器渲染网格是这样的?

    我自己决定将 OBJ 解析器 导入器支持添加到我一直在开发的 3D 渲染引擎中 我已遵循规范在这里找到 http www martinreddy net gfx 3d OBJ spec几乎 到了发球台 除了当前限制对组 面 顶点 法线和纹理
  • IllegalStateException:PWC3990:已为此响应调用 getWriter()

    java lang IllegalStateException PWC3990 getWriter has already been called for this response 如何解决这个错误 我运行一个简单的 servlet 代码
  • 如何使用 FirefoxProfile 或 FirefoxOptions 通过 Selenium 设置 Firefox 浏览器的窗口位置

    我需要通过创建驱动程序来更改 Firefox 窗口的位置 driver webdriver Firefox 我知道创建驱动程序后可以更改窗口位置 driver set window position 我不知道如何使用 Firefox 配置文
  • 如何读取.net中的SQL Server架构信息?

    我如何在 C 中知道数据库中的表列表 每个表具有完整规范的列列表 例如第一列是 Id 其数据类型为 int 50 等 Use the 获取模式 http msdn microsoft com en us library ms136366 a
  • 全新安装后 EKEventStore.calendars 始终为空

    我的 iOS 应用程序有一个奇怪的问题 在全新安装后 如果我尝试添加日历事件 在接受本机日历权限提示后 我的 eventStore 单例永远不会显示任何可用的日历 并且defaultCalendarForNewEvents总是nil 我尝试
  • jquery中如何将密码转换成md5? [复制]

    这个问题在这里已经有答案了 实际上我正在创建更改密码页面 这是我检查旧密码是否与现有密码匹配的功能 该密码存储在数据库中的 MD5 中 因此我想首先将该密码转换为 MD5 然后我可以检查该密码 这是代码 function fnIsValid
  • iOS“当前图形上下文”-那是什么

    当我绘制线条和形状等时 我会在 iOS 中获得 当前图形上下文 到底什么是 当前图形上下文 我正在寻找 30 000 英尺的描述 现在我只是复制并粘贴 UI 代码 不太确定它在做什么 图形上下文是存储有关绘图状态的信息的地方 这包括填充颜色
  • C# MVC 从 S3 异步下载大文件

    我必须从 aws S3 async 下载文件 我有一个锚标记 单击它时 将在控制器中点击一个方法以供下载 该文件应该在浏览器底部开始下载 就像其他文件下载一样 In View a href controller action paramet
  • HTML PDF 查看器

    除了使用 Acrobat Reader 之外 还有其他方法可以在网络上查看 PDF 文件吗 我需要控制查看器以编程方式触发文档的打印 PDF 的来源应来自网络服务 URL AspX 我认为最简单的方法是使用 Google Doc Viewe
  • 使用显式类型初始化 ImmutableMap? [复制]

    这个问题在这里已经有答案了 我需要初始化一个 ImmutableMap guava 21 0 并且我需要它解析为一个 Map gt 对于这个例子 我将只使用 String 所以我有 import com google common coll
  • 如何使用 Python 获取带有 Selenium 的

    我正在使用 Selenium WebDriver 使用 Python 进行 UI 测试 我想检查以下 HTML ul li Something here li li And here li li Even more here li ul 我
  • Java JDBC - 如何使用 tnsnames.ora 连接到 Oracle

    tnsnames ora文件包含Databases以及它们的描述 host port 是否可以依赖上述文件建立连接 仅提供数据库名称 为了找到这个文件 我必须知道默认的 oracle 主目录 我需要在 Windows 注册表中检查HKEY
  • 带子边距的 Div 高度

    我有 2 个 div 我想让它们的高度相等 var highestCol SecondColumn height column first height highestCol 我知道第二个 div 总是高于第一个 div 当两个 div 中
  • 如何将 Phillips Hue 灯泡的 RGB 值转换为 XY 值

    如何正确地将我拍摄的图片中的像素 RGB 值转换为发送到 Phillips Hue 设备所需的 XY 值 我当前的代码执行以下操作 1 拍一张照片 找出最常见的颜色 2 循环扔它们 然后再拍一张照片 3 将值发送到 Phillips Hue
  • 正则表达式匹配 html 标签之外的文本,而不是特定标签之间的文本

    我试图获得一个正则表达式来匹配 html 标签外部和之间的一些单词 而不是标签本身 但我还需要在它们位于 html 标题标签 h1 h2 h3 等 之间时排除它们 这是我尝试过的 bword b gt lt i 实例 https regex
  • 等待多重未来?

    我想运行相同类型的任务 工作线程 但一次不超过一定数量的任务 当任务完成时 其结果是新任务的输入 然后可以启动该新任务 有没有什么好的方法可以在 C 11 中使用异步 未来范例来实现这一点 乍一看 它看起来很简单 您只需使用以下命令生成多个