问题标签 [std-future]

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 投票
3 回答
4226 浏览

c++ - C++14/17 中的延迟评估 - 只是 lambdas 还是期货等?

我刚读到:

C++ 中的惰性求值

并注意到它有点旧,大多数答案都与 2011 年之前的 C++ 有关。现在我们有语法 lambdas,它甚至可以推断返回类型,所以惰性求值似乎可以归结为只是传递它们:而不是

你执行

然后评估您何时/何地需要:

似乎没有更多的东西了。但是,其中一个答案建议使用带有异步启动的期货。有人可以用 C++ 或更抽象地说明为什么/如果未来对于惰性评估工作很重要吗?似乎未来很可能会被急切地评估,但简单地说,在另一个线程上,并且可能比创建它们的优先级低;无论如何,它应该依赖于实现,对吧?

此外,在惰性求值的上下文中,是否还有其他现代 C++ 结构有助于牢记?

0 投票
1 回答
855 浏览

c++ - 异步 API 中 std::promise 的生命周期问题

我想知道如何使用承诺和期货开发异步 API。该应用程序正在使用单个数据流,该数据流用于主动提供的周期性数据和请求/回复通信。

对于请求/回复阻塞,直到收到回复不是一个选项,我不想使用回调乱扔代码,所以我想编写某种接受预期回复的 id 并退出的 SendMessage仅在接收时。由来电者阅读回复。

候选 API 可以是:

接收到消息的工作线程应该能够查询数据结构以了解是否有人在等待它并“释放”未来。

鉴于承诺不可重用,我想了解的是我应该使用什么样的数据结构来管理“飞行中”的承诺。

0 投票
4 回答
7669 浏览

c++ - 从 std::async 返回的 std::future 在超出范围时挂起

我正在使用std::asyncstd::futurefrom的组合C++ 11。我正在对我在代码中执行的某个活动强制执行超时,这在我尝试连接到服务器时可能需要一些时间。

以下是代码的样子:

在大多数情况下,事情都很好。未来超时并在许多情况下报告已准备就绪。但是,我观察到的奇怪行为是,在某些情况下,UI 会挂起,因为my_future_result超出范围时会挂起。我通过重复调用来确认这一点,my_future_result.get()如果在退出方法之前调用它就不会返回。

我怎样才能解决这个问题?有什么方法可以取消或删除或终止std::future?

0 投票
1 回答
1300 浏览

c++ - std::期货和异常

给定以下源代码

我希望,该程序将响应Valid: 0。使用 g++ 6.2.0 就是这种情况。但是,使用 MS VS2015 版本 14.0.25431.01 更新 3 的响应是Valid: 1. 在异常传播到主线程之后,未来的状态不会失效。这是一个错误还是我在这里遇到了未定义的行为?

0 投票
1 回答
2887 浏览

multithreading - 使用 std::promise 时出现 std::Future_error

我正在尝试制作视频播放器。我添加了一个线程来计时视频应该在屏幕上显示多长时间。我正在尝试在主线程中解码视频和更新窗口;第二个线程将获取数据包,查看数据包应该显示多长时间,然后将数据包发送到主线程,然后等待时间过去。

出于某种原因,我收到此错误:

是什么导致了错误?

我的代码:

0 投票
1 回答
615 浏览

c++ - 我可以执行获取我的 `std::future` 并等待它吗?

所以你可以创建一个在被调用std::future之前不起作用的:.get()

您还可以编写一个std::future可等待的,并且可以通过任何线程中的代码随时准备好:

如果你打电话f_deferred.wait_for(1ms),它不会打扰等待。如果你调用f_deferred.get(),你选择的一个 lambda (在这种情况下,一个打印的"I ran\n"执行。

如果您调用f_waitable.get(),则管理任务的代码无法知道有人在等待未来。但如果你打电话f_deferred.wait(1ms);,你会future_status::deferred立即得到。

有什么办法可以将这两者结合起来吗?

一个具体的用例是当人们排队任务时线程池返回期货。如果未排队的未来是.get()'d,我想使用被阻塞的线程来执行任务,而不是让它空闲。另一方面,我希望拥有返回期货的人能够确定任务是否完成,甚至等待有限的时间来完成任务。(如果您正在等待,我可以在您等待期间您的线程处于空闲状态)

如果做不到这一点,在即将到来的提案中是否有比让我的线程池返回具有所有限制的未来更好的解决方案?我听说期货没有未来,期货解决的问题存在更好的解决方案。

0 投票
1 回答
74 浏览

multithreading - 在抽象基类中使用 c++11 的 std::async

为什么不让这样的线程在抽象基类中工作?我试图为从这个基类派生的用户抽象出所有的多线程细节。callbackSquare当我清楚地写出返回 type时,我不明白为什么它说“没有名为'type'的类型” int

我得到的奇怪错误是:

0 投票
2 回答
155 浏览

c++ - shared_ptr 的 use_count() 在 gcc 4.6.3 中移入 std::async

在下面的代码中,我希望移入use_count()的是:shared_ptrstd::async1


我的平台使用 gcc 4.6.3,上面的代码给出了这个输出(fun: sp.use_count() == 2):


coliru.stacked-crooked.com 上,我得到了我想要的行为(fun: sp.use_count() == 1):


我不确定 coliru 使用的是什么编译器,但我猜它比 gcc 4.6.3 更新。

是否有某种方法,一些解决方法,可以获得我想要的行为,而不必从 gcc 4.6.3 升级我的编译器?

0 投票
1 回答
748 浏览

c++ - std::future 如何影响关联的 std::packaged_task 的生命周期?

我有一个std::packaged_task包含一个通过复制捕获变量的 lambda。当 thisstd::packaged_task被删除时,我希望 lambda 内的变量被破坏,但我注意到如果我获得std::futurethis的关联std::packaged_task,该future对象会延长 lambda 内变量的生命周期。

例如:

一个可能的输出是:

因此 lambda 中的对象的生命周期延长了future_result.

如果我们注释掉这一行future_result = p_task->get_future();,可能的输出是:

我一直想知道这里有什么机制起作用,是否std::future包含一些使关联对象保持活动状态的链接?

0 投票
1 回答
324 浏览

c++ - std::promise 是否可以知道相应的 std::future 已取消等待?

我的情况是我有一个连续的线程处理一些输入。但是,有时工作量太大,相应的未来也不会等到结果。在这种情况下我需要释放一些资源,因为计算结果将不会继续进行(被标记为能够被释放,在其他地方)。

承诺是否有可能知道各自的未来已经停止等待?或者我可以通过其他方式达到这个效果吗?( shared_future, ...?)

作为概念的概述,我修改了std::promise 示例,以便您更容易理解我的意思: