问题标签 [concurrency-runtime]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
130 浏览

c++ - 分析 concurency::task() API & 为什么我们需要这个?

我正在尝试理解以下代码片段中 concurrency::task 的语法。

我无法理解这个代码片段语法。我们如何分析这个:

这里的“getFileOperation”是什么。它是 StorageFile 类类型的对象吗?“then”关键字在这里是什么意思?之后有一个“{”(....)?我无法分析这种语法?

另外为什么我们需要这个并发::task().then().. 用例?

取自 MSDN concurrency::task API

0 投票
1 回答
801 浏览

c++ - 如何告诉 C++ 并发运行时重用前一个线程来继续任务

我使用 Visual c++ 并发运行时创建了一个任务,然后在其上安排了四个延续

这将打印以下输出

请注意,这 4 个延续未安排在与初始任务相同的线程上。有没有办法在与初始任务相同的线程上安排延续?我相信这可以通过使用TaskContinuationOptions.ExecuteSynchronously选项在 c# 中实现。

0 投票
2 回答
463 浏览

c++ - C++ 等待但允许事件触发

使用 Visual Studio 2013 构建 SignalR C++ 客户端,我从 NuGet Package Microsoft.AspNet.SignalR.Client.Cpp.v120.WinDesktop中的工作示例代码开始,来源在这里

查看库源,在我看来,事件处理过程是基于依赖于C++11 特性的并发运行时(pplx::task)

我想消除“用户输入”组件;而是在收到特定的“broadcastMessage”时退出循环。

如果我用 sleep 语句替换 for 循环,则 broadcastMessage 事件将停止触发。

如果我在没有 getline 的情况下使用 for 循环,完成后将 bComplete 设置为 true,它会按我想要的方式工作,但会导致 CPU 使用率很高(显然)

理想情况下,我希望连接开始,然后等到广播消息事件发出信号关闭连接。此外,“聊天”功能在连接关闭之前不应返回。

0 投票
1 回答
368 浏览

c++ - 带有异常的 Windows 并发运行时任务调度

根据MSDN

基于任务的延续总是安排在前面的任务完成时执行,即使前面的任务被取消或抛出异常也是如此。

我不明白这一点,因为我尝试了以下代码,并且当第一个任务通过抛出异常完成时不会调用后续任务。我理解为什么它必须将呼叫转发到被呼叫的站点,concurrency::task::wait但我不明白 MSDN 上的声明是什么意思。我有什么误解?

0 投票
0 回答
110 浏览

c++ - PPL。如何在同一个工作线程上安排多个任务?

我需要知道如何控制将在哪个工作线程Concurrency::task上运行。

想象一下,如果我有以下代码:

我如何确保这两个任务将在同一个工作线程上运行?

0 投票
1 回答
1186 浏览

c++-amp - '并发':具有此名称的命名空间不存在

我是一名业余 C# 程序员,由于需要 C++ AMP 技术来处理一些繁重的数字运算,因此误入了 C++。因此,我的 C++ 编程技能并没有得到很好的发展。

在我第一次尝试实际程序时,我选择了基于Daniel Moth 2012 年 4 月文章的代码。我无法建造它。我总是得到错误:

C2871 '并发':具有此名称的命名空间不存在。

我知道代码最初是为 Visual Studio 11 编写的,但我的机器上只有 VS 2008 和 VS 2010。所以,我安装了 VS 2017(版本 15.9.4,.Net 4.7.03062)。我从一个空的 C++ 项目开始,但遇到了麻烦。在我完成了它无法识别的所有事情之后,我能做的最好的事情就是一个错误:

C3861:未找到“访问”标识符,文件“amp.h”中的第 2616 行。

所以我又开始了,这次是一个空的 Windows 控制台应用程序项目。同样,我不得不大幅调整代码以从 Visual Studio 11 迁移到 VS 2017,但最终得到的代码如下所示。

我尽我所能找到错误的根源。我同时针对 x64 和 x86,但没有任何区别。我注释掉了第 5 行和第 21-27 行,代码将构建并执行。IntelliSense 没有显示任何问题,无论是标识符还是语法。事实上,鼠标悬停的信息Concurrency就是这样识别结构的。我故意拼错Concurrency了,但 IntelliSense 马上就发现了。我查看了项目属性,着眼于需要更改以运行 AMP 的设置,但由于我什至不确定我在寻找什么,所以我什么也没找到。

我试图找到其中Concurrency定义的文件的名称,以便我可以搜索我的机器以查看它是否存在,如果存在则添加路径,但未成功。我什至找不到文件名。我用谷歌搜索并仔细研究了在线资源和 MS Docs,但无论我如何表达我的搜索问题,我都没有找到任何答案。

错误说:

并发不存在

这对我来说意味着它找不到它,它不在机器上,或者某些构建设置阻止它被使用。大多数关于编写 AMP 代码的在线文章都没有提到构建设置。它不需要与串行编码项目不同的东西吗?它就像缺少参考一样简单吗?如果是这样,我在哪里可以找到它?以我有限的经验,我不知道还有什么可以尝试的。

我的机器是 Win 7 SP1 盒子。已安装 KB2999226错误修复程序。我没有安装所有 VS 2017,因为我只对 C# 和 C++ 感兴趣。我没有安装我应该拥有的东西吗?

如果这个问题以前解决过,我找不到它。因此,任何帮助将不胜感激。

0 投票
2 回答
536 浏览

c++ - 如何组合异步操作?

我正在寻找一种组合异步操作的方法。最终目标是执行异步操作,或者让它运行完成,或者在用户定义的超时后返回。

出于示例目的,假设我正在寻找一种方法来组合以下协程1

socket_作为一个实例StreamSocket

和超时协程:

我正在寻找一种方法以某种方式组合这些协程,一旦读取数据或超时已过期,就会尽快返回。

这些是我迄今为止评估过的选项:

  • C++20 协程:据我了解P1056R0,目前没有库或语言功能“启用协程的创建和组合”
  • Windows 运行时提供了异步任务类型,最终派生自IAsyncInfo:同样,我没有找到任何可以让我按照我需要的方式组合任务的工具。
  • 并发运行时:这看起来很有希望,特别是when_any函数模板看起来正是我所需要的。

从那看来我需要使用并发运行时。但是,我很难将所有部分组合在一起。我对如何处理异常以及是否需要取消相应的其他并发任务感到特别困惑。

问题有两个方面:

  • 并发运行时是唯一的选项(UWP 应用程序)吗?
  • 实现会是什么样子?

1 这些方法在应用程序内部。不需要让它们返回与 Windows 运行时兼容的类型。

0 投票
0 回答
86 浏览

c++ - concurrency::task 类模板可以使用哪些类型?

我正在尝试从并发运行时任务返回自定义类型。我的自定义类型应该只能通过静态工厂方法构造(除了可移动构造之外),例如:

还有一个简单的测试用例:

但是,这无法编译,产生以下(删节的)编译器诊断:

这里毫不奇怪,copy-c'tor 确实被明确删除,故意的。我只是不明白,为什么不将移动构造函数视为候选人。

只要我提供一个default-c'tor、一个copy-c'tor和一个copy-assignment运算符,我似乎可以编译代码。这是库 (ConcRT)、编译器 (Visual Studio 2019 16.1.0)、编程语言还是我对它的控制的限制?

换一种说法:我能做些什么来让我的自定义类型(按原样)与concurrency::task.

0 投票
0 回答
312 浏览

c++ - 为什么我应该使用 concurrency::critical 部分来代替其他锁定机制

concurrency::parallel_for()在 Windows 应用程序(Visual Studio 2017)中使用循环划分一些工作。一切正常,但我担心锁定性能,所以我尝试了各种方法: std::mutex、windowsCRITICAL_SECTION等。

然后我尝试了concurrency::critical_section。该文档使它听起来应该更快,因为它知道并发运行时。

没有。它不仅速度不快,在某些情况下还非常危险。起初它只是炸毁了我的应用程序。在调试器中,我可以看到并发只是创建了无限线程。CRITICAL_SECTION当我将分区器从默认更改为静态分区器时,一切又开始工作了,但是一切都比使用 Windows甚至慢得多std::mutex

我想知道是否有人可以向我解释以下任何一个

  1. 为什么我concurrency::critical_section在我的 lambda(下)中使用默认分区器会使并发创建无限线程?
  2. 为什么(即使我通过使用 来让它工作static_partioner)比其他锁定机制parallel_for()慢得多?concurrency::critical_section
  3. 用例是concurrency::critical_section什么?

这是我的代码

我检查过的几件事:

  1. 我已经验证代码没有抛出任何异常。
  2. 此代码不是递归的。(我知道这concurrency::critical_section不是递归锁,但 std::mutex 也不是,而且工作得很好)。
  3. 我什至已经完成了它,并且我控制确实离开了例行程序。