问题标签 [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 回答
532 浏览

c++ - “unbounded_buffer”中的消息数

该类Concurrency::unbounded_buffer可以存储任意数量的消息。但是如何知道待处理(未收到)消息的数量?

0 投票
1 回答
343 浏览

c++ - 异步代理和窗口消息

我目前正在使用 Microsoft 的并发运行时中的异步代理库。我还没有找到一种明显的方法来通过使用窗口消息或其他通知 UI 线程工作已完成的方式来表示任务已完成。

我知道我可以将窗口句柄和消息值 ( WM_xxx) 传递给任务,并让任务用于PostMessage()向 UI 线程发出信号。在我看来,这有点丑陋,并且是错误的来源。如果发生异常,我必须有一个 catch 处理程序来向我的 UI 线程发出信号。这很容易被遗忘,并且异常条件可能不会经常运行,因此很难发现它。

该文档讨论了如何将数据移回 UI 线程。它不使用窗口消息,而是使用轮询技术。当有可用的“中断”方法时,我发现设置计时器来轮询任务是否完成是很愚蠢的!

奇怪的是,它没有内置到库中,因为它不是跨平台库。据我了解,它设计为在 Windows 上运行,并且仅在 Windows 上运行。

库中的功能是否可用,还是我必须手动滚动?

0 投票
1 回答
311 浏览

c++ - 在非运行时线程上使用 VS2010 并发运行时消息传递类(unbounded_buffer 等)

我喜欢 unbounded_buffer 的便利性,但我也想在并发运行时一无所知的线程上使用这个类。在我的测试中,它似乎工作正常。这种方法有什么潜在的问题吗?

0 投票
1 回答
298 浏览

c++ - VS2010 的并发运行时和 unbounded_buffer>,有什么陷阱吗?

我想从 dll 传递堆分配的对象。显然,必须正确管理内存。有没有人看到我设计的以下狡猾方案有问题:

我知道 shared_ptr 为包含的对象隐藏了一个删除器,因此在 dll 边界上单独使用它应该不是问题。

0 投票
1 回答
1247 浏览

c++ - 并发,任务

我是 Microsoft 并发运行时(以及一般的异步编程)的新手,我试图了解可以用它做什么和不能做什么。是否可以创建一个任务组,使任务按添加顺序执行,并且任何任务直到前一个任务结束才开始?

与在单个成员函数中链接多个任务相比,我试图了解是否有一种更通用和更分散的方式来处理任务。例如,假设我有一个程序在程序的不同点创建资源,资源分配的顺序很重要。任何被调用的资源分配函数是否可以简单地将任务附加到中央任务列表的末尾,结果任务按照它们被添加的顺序执行(即资源分配函数被调用的顺序)?

谢谢,

罗伯特F

0 投票
1 回答
707 浏览

c++ - 为并发运行时实现任务局部变量

我正在通过使其更加异步来改进应用程序(Win64、C++)。我正在使用并发运行时,到目前为止它对我来说效果很好。

该应用程序基本上执行许多“作业”转换数据。为了跟踪每个作业的功能,某些子系统配备了代码来跟踪作业执行的某些操作。以前,这将使用表示当前正在执行的作业的单个全局变量来注册跟踪信息,而无需将上下文信息一直传递到调用链中。每个作业也可以轮流使用 ConcRT 来并行化作业本身。这一切都很好。

不过,现在我正在重构应用程序,以便我们可以并行执行顶级作业。每个作业都作为 ConcRT 任务执行,这适用于除需要跟踪的作业之外的所有作业。

我基本上需要的是一种将一些上下文信息与任务相关联的方法,并将该流程流向由该任务产生的任何其他任务。基本上,我需要“任务本地”变量。

使用 ConcRT,我们不能简单地使用线程局部变量来存储上下文信息,因为该作业可能会使用 ConcRT 生成其他作业,并且这些作业将在任意数量的线程上执行。

我目前的方法包括在启动时创建许多调度程序实例,并在专用于该作业的调度程序中生成每个作业。然后我可以使用该Concurrency::CurrentScheduler::Id()函数检索一个整数 ID,我可以将其用作找出上下文的键。这是可行的,但是单步执行Concurrency::CurrentScheduler::Id()in 程序集让我有些畏缩,因为它执行多个虚拟函数调用和安全检查,这增加了很多开销,这有点问题,因为这种查找需要以极高的速度完成在某些情况下率。

那么 - 有没有更好的方法来实现这一点?我很想拥有一流的 TaskLocal/userdata 机制,它允许我将单个上下文指针与当前的 Scheduler/SchedulerGroup/Task 相关联,我可以用很少的开销进行检索。

每当 ConcRT 线程抓取新任务时调用的钩子将是我的理想选择,因为我可以检索 Scheduler/ScheduleGroup ID 并将其存储在本地线程中以最小化访问开销。唉,我看不到任何注册这样一个钩子的方法,而且似乎不可能为 PPL/代理实现自定义调度程序类(参见这篇文章)。

0 投票
1 回答
185 浏览

c++ - 为什么我可以选择*不*在运行中调用 Concurrency::agent::done?

这是在 Microsoft C++ 并发 API 的上下文中。

有一个名为agent(在Concurrency命名空间下)的类,它基本上是您派生和实现纯虚拟的状态机agent::run

现在,调用 是您的责任agent::start,这会将其置于可运行状态。然后调用agent::wait* 或其任何变体来实际执行该agent::run方法。

但是为什么我们必须agent::done在体内呼唤呢?我的意思是,显而易见的答案是agent::wait* 将等到发出完成信号或超时已经过去,但是......

设计师的意图是什么?为什么代理agent::run返回时不进入完成状态?这就是我想知道的。为什么我可以选择不打电话done?如果超时已过,wait 方法会抛出异常。

0 投票
2 回答
1669 浏览

c++ - MS 并发运行时的限制是什么?

task_group在 Visual Studio 2010 中使用简单的并发运行时来运行单个工作线程以将工作与 GUI 线程分开。

然而,我的一位同事告诉我,我使用 CR 是错误的:它是为并行处理具有小上下文的轻量级任务而设计的,而不是用于从 GUI 中分离庞大且依赖 I/O 的线程。他说他从文档中获取了这个,但没有提供任何具体的链接。

那么,微软并发运行时的限制是什么,以及解决哪些问题我不应该使用它

当然 CR 不是可移植的,但让我们把它排除在外:我说的是情况,当你的代码编译时,你仍然会遇到问题。

0 投票
2 回答
5414 浏览

c++ - 异常处理、WinRT C++ 并发异步任务

我必须在 C++ 中实现异步 HTTP GET,并且我们必须能够将应用程序提交到 Windows 8 应用商店。

我的问题如下:

我找到了一个合适的示例代码,它实现了一个 HttpRequest 类http://code.msdn.microsoft.com/windowsapps/HttpClient-sample-55700664

如果 URI 正确,则此示例有效,但如果 URI 指向无效/不存在的位置(例如:www.google22.com),则会引发异常。如果我能捕捉到异常,这会很好,但我无法弄清楚我应该如何或在哪里捕捉它。

现在一些代码。这是对抛出异常的基于异步、并发::任务的方法的调用:

这是 GetAsync 方法的相关部分(方法的结尾):

CheckHResult 行抛出异常,代码如下:

我在 GetAsync 调用周围有一个 try-catch,在 .then 延续 lambda 中也有一个 try-catch。

在相关的 Microsoft 文档(http://msdn.microsoft.com/en-us/library/windows/apps/hh780559.aspx)中,它指出任务引发的异常应该可以在链中的下一个任务中捕获,但不知何故在我的情况下它不起作用。此外,甚至整个调用周围的 try-catch 都没有捕获异常,它只是跳过了所有内容......

有人遇到过这个问题吗?我想我已经尝试了官方文档中所述的所有内容,但它仍然让异常变得疯狂并使应用程序崩溃。我想念什么?

编辑:

我已经修改了代码,除了异常处理之外什么都不做,它仍然没有捕获 .GetAsync 中的任务抛出的异常

清理后的代码:

这仍然让我崩溃并出现异常消息:App1.exe 中 0x75644B32 的第一次机会异常:Microsoft C++ 异常:Platform::COMException ^ at memory location 0x077EEC28。HRESULT:0x800C0005

此外,当我在代码中放置一些断点时,它表明异常会在第一个 .then 被调用之前滑过所有内容。我在这些位置放置了断点(在简化/清理的代码中):

  • 在 GetAsync 调用之前
  • 进入 GetAsync,到CheckHResult(std::get<0>(resultTuple)); 抛出异常的行
  • 进入每个尝试和捕获案例/块

执行顺序,用断点测试:

  1. 在 GetAsync 调用之前 [OK]
  2. 在 GetAsync 中,将抛出异常的行 [OK]
  3. 现在应用程序崩溃了,每次尝试捕获都会滑倒,继续
  4. 现在第一个.then中的行被调用,在它的 try 块中
  5. 任何 catch 块未捕获的另一个应用程序级异常
  6. 现在是第一个.then的 catch 块
  7. 第二个 .then 方法的try
  8. 仅此而已,第二个.then的捕获甚至没有捕获任何异常

以及打印的调试日志,依次为: - 开始获取 uri... - App1.exe 中 0x75644B32 处的第一次机会异常:Microsoft C++ 异常:Platform::COMException ^ 在内存位置 0x082FEEF0。HRESULT:0x800C0005 - App1.exe 中 0x75644B32 处的第一次机会异常:Microsoft C++ 异常:在内存位置 0x00000000 处 [rethrow]。- App1.exe 中 0x75644B32 处的第一次机会异常:Microsoft C++ 异常:Platform::COMException ^ 位于内存位置 0x082FE670。HRESULT:0x800C0005 - App1.exe 中 0x75644B32 处的第一次机会异常:Microsoft C++ 异常:Platform::COMException ^ 位于内存位置 0x082FDD88。HRESULT:0x800C0005 - 未知异常

怎么了??

0 投票
1 回答
600 浏览

c++ - ConcRT 的定期任务

我正在编写一个 C++ 应用程序,除其他职责外,它会定期(每小时一次)向服务器发出请求。
此计划任务可以被中断并强制执行更早(当应用程序接收到新的用户数据时)。为此,我决定使用 ConcRT。

  • 有没有这种调度的标准方式(如 Win32 中的定时器队列)但有任务和任务组?
  • 还是我应该将任务与延续联系起来?
  • 也许代理库更适合这个?(我认为这对我的问题来说太过分了)

PS HTTP 请求是使用老式 WinHTTP 发出的(可执行文件不能依赖第三方库并保持较小的大小)。那么有没有符合 ConcRT 机制的 HTTP 请求功能的异步实现呢?