std::list 析构函数不阻塞

2024-02-23

我有一个多线程应用程序,有一个循环作为主线程等待用户输入。 在正确的输入上,它应该停止循环并等待所有其他线程正确结束。

为此,我创建了一个 std::list ,其中放置了为创建线程而创建的 std::future 对象

std::list<std::future<int>> threads;
threads.emplace_front(std::async(std::launch::async, ...));

我的印象是,让 list 超出范围,应该阻塞,直到所有线程返回其主函数,因为 list 的析构函数将解构所有 std::future 元素和那些的析构函数 http://en.cppreference.com/w/cpp/thread/future/~future将等待线程完成。

EDIT:由于它是相关的,我将在这里添加它: 这是在Win7上使用Visual Studio 2013 Professional中的MSVC版本/EDIT

当我尝试这个时,它没有阻止,我必须添加

for (auto it = threads.begin(); it != threads.end(); ++it) {
    it->get();
}

到函数末尾,以正确阻止。

我是否误解了什么,或者我是否必须以不同的方式创建线程,才能在这里做我想做的事情?


这是一个MSVC 错误已修复 https://connect.microsoft.com/VisualStudio/feedback/details/810623,但要等到 MS 发布新版本的 Visual C++(可能是 2015 年的某个时间)后,此修复程序才会可用。(这也是在新版本的 CTP 中可用 http://blogs.msdn.com/b/vcblog/archive/2014/06/06/c-14-stl-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1.aspx,但将其用于任何生产代码都是一个非常糟糕的主意......)

正如斯科特·迈耶斯 (Scott Meyers) 所解释的那样他的博文 http://scottmeyers.blogspot.com/2013/03/stdfutures-from-stdasync-arent-special.html, a 的析构函数std::future由返回std::async呼叫使用launch::async策略需要阻塞,直到生成的线程完成执行(§30.6.8 [futures.async]/p5):

如果实施选择launch::async policy,

  • [...]
  • 关联的线程完成与同步(1.10) 从第一个成功检测到就绪的函数返回 共享状态的状态或从最后一个函数返回的状态 释放共享状态,以先发生者为准。

在这种情况下,future的析构函数是“释放共享状态的最后一个函数”,因此线程完成必须同步于(即发生在)该函数的返回之前。

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

std::list 析构函数不阻塞 的相关文章

  • 错误:表达式不可赋值三元运算符

    我有以下代码 MPLABX XC8 编译器给出此错误 错误 表达式不可分配 U1ERRIRbits RXFOIF uart1 oerr 1 uart1 oerr 0 这是相关代码部分 typedef union struct bool fe
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • C++中类成员函数相互调用有什么好处?

    我是 C 新手 我发现下面的编程风格对我来说很有趣 我在这里写了一个简化版本 include
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 如何在 Linux 上重新实现(或包装)系统调用函数?

    假设我想完全接管 open 系统调用 也许要包装实际的系统调用并执行一些日志记录 一种方法是使用 LD PRELOAD http scaryreasoner wordpress com 2007 11 17 using ld preload
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • X 轴和 Z 轴上的 Quaternion.Slerp,无 Y 轴

    I am trying to rotate the Player about X Y and Z axis The Y axis should not move from last angle Example if I rotate 45
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • C# 可以为控制台应用程序部分类“程序”类吗?

    我想知道是否可以将为任何控制台应用程序创建的默认 程序 类更改为部分类 我想这样做是因为我想要更好的组织 而不是将所有方法都放在按区域分类的 1 个文件中 对我来说 将某些方法类别放在单独的文件中会更有意义 我对分部类的理解是 它是多个文件
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w

随机推荐

  • ASP.NET 如何知道在回发期间触发哪个事件?

    在回发期间 EVENTTARGET表单变量保存name of the control发出回发 如果控件支持多个服务器端事件 ASP NET 如何知道要为该控件触发哪个事件 正如 Wiktor 提到的 ASP Net 中的许多控件已经为您以某
  • Inno Setup - 如何本地化组件和类型名称?

    如何本地化组件和类型名称 例如 Languages Name eng MessagesFile Idiomas English isl Name spa MessagesFile Idiomas Spanish isl 如果我选择英语 Ty
  • iOS CPU 配置文件:为什么这个线程会占用 99.9% 的 CPU?

    有时 当我加载表视图时 除了让表视图显示之外 我没有故意执行任何活动 我会等待几秒钟 然后 CPU 使用率就会飙升 我怎样才能找到原因 为什么这个线程会占用 99 9 的 CPU 我不知道 但这里有一些想法 负责的图书馆是UIKit 所以看
  • 暴露 Google Container Engine 中的两个端口

    是否可以在 Google 容器引擎中创建一个公开两个端口的 Pod 端口 8080 正在侦听传入内容 端口 80 将此内容分发给客户端 Google 给出了以下创建 Pod 的命令作为示例 kubectl run hello node im
  • JavaScript JSON 解析器告诉错误位置

    我在解析通过 WebSocket 接收的 JSON 时遇到了一些麻烦 原始问题 解析通过 WebSocket 接收到的 JSON 会导致错误 https stackoverflow com questions 7116035 parse j
  • 枚举类型的复选框列表 MVC Razor

    在我的 c net MVC 应用程序中 我想显示枚举类型的复选框列表 我有一个枚举类型 Flags public enum ModeType Undefined 0 Read 1 Edit 2 我的模型是 Public TrainingMo
  • https 设置后 django 站点 ERR_SSL_PROTOCOL_ERROR

    所以我正在尝试部署我的网站并且基本上尝试过 python manage py check deploy 并遵循它告诉我的一切 WARNINGS security W004 You have not set a value for the S
  • 使用部分字符串 lua 查找完整字符串

    我试图在表中查找整个字符串而不编写完整的字符串 Example maintable SecondString FirstString c First 我怎样才能使用字符串c无需输入整个字符串名称即可查找 FirstString 的完整名称
  • 带有 Bootstrap 布局的 jQuery UI 可拖动

    jQuery 可拖动元素位于引导样式列 col 下 例如 我有两个 row每列分为 4 列 col md 3 我试图将第一行列拖动到第二行可放置列上 但是当我拖动 Drag 元素时 它们总是位于 可放置 元素下方 我无法使用 Bootstr
  • Flutter ScreenState Dispose 方法异常

    当我尝试在颤动中从一个屏幕导航到另一个屏幕时 我收到一个异常 指出我要更改的 ScreenState 不会调用super dispose in its dispose方法 然而 被覆盖的dispose方法明确调用super dispose
  • 使用 l20n 本地化属性

    我想本地化一个placeholder具有 L20N 属性 我在他们的文档中找不到任何内容 并且这样做 毫不奇怪 不起作用
  • Dropzone上传的文件同名

    我有一个带有 dropzone 的普通表单 所有值和文件都上传到服务器 但是当我通过打印 FILES 变量检查它时 所有上传的文件与最后上传的文件具有相同的名称和扩展名 但具有正确的 mime 每个文件的类型 因此 当我上传具有不同文件类型
  • OpenCV 读取不起作用

    I have loop in my C code to open and process a set of images One of those is https i stack imgur com rUJnp gif https i s
  • 如何在 Python 中将表示二进制分数的字符串转换为数字

    假设我们有一个表示二进制分数的字符串 例如 1 以十进制数表示为 0 5 Python 中是否有一种标准方法可以将此类字符串转换为数字类型 无论是二进制还是十进制并不严格重要 对于整数 解决方案很简单 int 101 2 gt gt gt
  • 伪快速排序时间复杂度

    我知道快速排序有O n log n 平均时间复杂度 经常用于演示函数式语言的简洁性的伪快速排序 仅当您从足够远的地方看时 具有适当高的抽象级别时 它才是快速排序 如下 在 Haskell 中给出 quicksort Ord a gt a g
  • GDB:捕获信号并继续调试

    我试图在 GDB 中捕获浮点异常 SIGFPE 而不是将其传递给进程并继续调试 我已经给了 gdb 这个 handle SIGFPE stop nopass 当 SIGFPE 发生时 GDB 会停在正确的位置 问题是我不能也不知道如何继续调
  • 创建相对于 jetpack 中其他元素的垂直链组成 ConstraintLayout?

    我想使用 chainStyle Packed 将标题和描述文本链接到以图像为中心的位置 如何在 jetpack compose 中实现此目的 当我使用时createVerticalChain 它相对于父容器的创建链不是我想要的 有没有办法实
  • 使用 Visual Studio 2013 构建 64 位 Live555

    我正在尝试在 Windows 7 上使用 Visual Studio 2013 64 位构建 Live555 的组件 我尝试编辑 win32config 和 mak 文件 但没有成功 我已经在互联网上搜索了几个小时 并使用命令提示符尝试了各
  • 在 Code Igniter 2.02 中设置电子邮件

    我收到很多错误 我已经在不同的站点尝试了几个建议 删除了父函数 删除了数组 更新了我的 php ini 文件 但没有运气 这是我收到的 13 个错误中的第一个 遇到 PHP 错误 严重性 警告 消息 fsockopen function f
  • std::list 析构函数不阻塞

    我有一个多线程应用程序 有一个循环作为主线程等待用户输入 在正确的输入上 它应该停止循环并等待所有其他线程正确结束 为此 我创建了一个 std list 其中放置了为创建线程而创建的 std future 对象 std list