问题标签 [packaged-task]
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.
c++ - C++ packaged_task 挂在并发包装器中
我正在实现 Herb Sutter 在他的演讲“C++ and Beyond 2012”中介绍的并发包装器。
基本上,这个想法是包装一个对象并使用 operation 以 FIFO 顺序提供线程安全访问()
。但是,在某些运行中(并不总是发生),以下程序挂起:
但是,程序可以在没有显式调用get()
方法的情况下正常工作。
可能是什么问题?我执行错了吗?我注意到这里有一个帖子说“在调用 f.get() 之前需要调用 packaged_task,否则你的程序将冻结,因为未来永远不会准备好。” 这是真的?如果是,我怎样才能解决这个问题?
-std=c++1z -pthread
我正在使用with编译代码G++ 6.1
c++ - 将虚拟复制构造函数添加到 std::packaged_task
我试图绕过 std::packaged_task 缺少复制构造函数,以便我可以将它传递给 std::function (只会被移动)。
我从 std::packaged_task 继承并添加了一个虚拟复制构造函数,如果我从不复制它移入的 std::function,我认为不应该调用它。
用 gcc 6.2.1 编译它,我收到以下错误消息(只是结尾部分,如果你想要整个事情,请告诉我......):
错误消息对我来说是无法解析的,所以我想知道我是否做错了什么或者编译器是否失败。
c++ - std::packaged_task 如何工作
我正在分析以下代码片段,并试图详细了解它:
我对std::packaged_task
.
正如您在add(...)
方法体中看到的, std::packaged_task
-的实例task
是局部变量,其作用域以方法执行结束而结束。type的返回值ret
是std::future
copy返回的。的值ret
是由task
(本地的)给出的。因此,一旦方法执行完成,task
就会超出范围,所以我希望返回的连接的 std::future 实例变得无效,我的理解是否正确?
在方法的执行过程中,要在线程中执行的任务方法被放置到std::queue<Job> jobs
. 为什么只有指向 which 的指针operator()
持有std::packaged_task
对Function
给定方法参数的引用std::queue
?我希望直接存储std::packaged_task
以保存对正在创建的实例的引用......?
无论如何,源代码片段来自 ThreadPool 实现,可以在这里找到https://github.com/dabbertorres/ThreadPool并且似乎完全可以工作。所以我认为这是正确的,但不幸的是我并不完全清楚......如果有人能解释这些东西是如何工作的,我会很高兴......
非常感谢任何愿意提供帮助的人。干杯马丁
c++ - 为什么在 VS 中需要 packaged_task 的复制构造函数
我想在 packaged_task 中包装一个对象实例,如下所示:
我收到“错误 C2280: 'MoveOnlyOperation::MoveOnlyOperation(const MoveOnlyOperation &)': 试图引用已删除的函数”
C++ 11 的文档说,尽管可以完美地转发 packaged_task 中的实例。我也没有clang的问题。
它定义了一些关于如何实现 packaged_task 的实现或 VS 2015 中的错误(可能稍后因为我遇到与http://rextester.com/WBEH22233相同的问题)
c++ - 为什么`packaged_task`没有推导指南?
我天真地期待这个编译:
说明:这可能来自线程池实现,enqueue()
只是将参数排队以在工作线程上执行。
然而,问题是没有 的推导指南packaged_task
,因此 C++17 构造函数模板参数推导当然会失败。
那么,为什么没有扣除指南呢?
c++ - 将 std::packaged_task 添加到现有线程?
是否有标准方法可以将 a 添加std::packaged_task
到现有线程?在任务运行之前必须发生大量开销,所以我想这样做一次,然后保持线程运行并等待任务执行。我希望能够使用期货,因此我可以选择获取任务的结果并捕获异常。
我的 C++11 之前的实现要求我的任务从带有Run()
方法的抽象基类继承(有点痛苦,不能使用 lambdas),并且有一个std::deque
我在主线程中添加的集合和从工作线程中出列。我必须保护该集合不被同时访问,并向工作线程提供一个信号,表明有事情要做,因此它不会旋转或休眠。将某些内容加入队列会返回一个“结果”对象,该对象带有一个等待任务完成的同步对象,以及一个结果值。这一切都很好,但如果有更好的东西,是时候升级了。
c++ - 打包任务参数是否存在数据竞争?
通过打包的任务创建一个线程并std::vector
返回一个。
std::future
保证向量与线程同步(main
之前join
),但我不确定打包任务参数的状态(通过引用传递)。
所以问题是是否存在数据竞赛arg
?
c++ - 在 lambda 中包装并执行 packaged_task
我正在尝试将 packaged_task 包装在 lambda 中,以便将它们存放在容器中。我在下面编写了一个测试代码,用于模拟包装和调用 lambda 函数。我的代码如下:
该程序因以下异常而中止:
抛出“std :: system_error”实例后调用终止what():未知错误-1中止(核心转储)
有人能解释一下为什么抛出异常吗?
c++11 - 传递 packaged_tasks 队列作为参考时出现编译错误
当我尝试将包含 packaged_task 对象的队列作为参考传递给线程时出现编译错误。我修改了示例代码以将其传递给函数并观察到相同的编译错误