问题标签 [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
函数给出以下错误。
我不明白的是,为什么f
并args
成为构造函数中的引用类型?Args...
是int, int
类型,而刚刚args...
成为int&, int&
。这是从哪里来的?
c++ - 尝试排队一些可变的工作
我正在尝试编写一个工作队列,但是直到以后我才真正想知道参数类型,无论如何我正在尝试编写一些大意的东西
示例用法
我正在尝试以合理的速度将这项工作排队,以使尽可能多的工作远离该队列的收集端。我只是将参数序列化为类似字符串流的东西,但随后我将不得不在反序列化方面进行某种类型的强制转换,担心消息+边界等,我想避免这种情况。任何人都知道我在这里可能做错了什么以获得类型错误,还试图避免提升,因此最好使用 stl 容器。我无法提前知道结构来专门研究这个。此外,您还想确保将参数复制到队列中,而不是简单地引用,这样即使在从调用函数的堆栈中取消分配后它们也很有用。
c++ - 使用 scoped_lock 从互斥队列中提取它后运行 packaged_task
在使用 scoped_lock 锁定两个互斥锁后,我需要从队列中执行提取的任务,问题是将任务从队列交换到另一个,然后执行它。到目前为止,这是我的起点
但我无法将任务保存到变量中以便以后执行。
c++11 - 检测 std::packaged_task 的崩溃
我想检测打包的任务是否成功完成,但是当任务中的错误导致线程崩溃(来自一些第 3 方代码)时,会有一些边缘情况。在这些情况下,下面的代码没有捕获到异常,我无法判断线程崩溃了。future_status 在崩溃时设置为就绪;但是,如果我在加入线程之前尝试使用 .get() 获取结果,则未来将在内部调用 _M_state->wait 后中止。在内部我可以看到未来的 _M_state._M_result 充满了垃圾。
谁能想到如何确定任务是否成功完成?
结尾
c++ - Create a packaged_task of function object
How to create a packaged_task
of a function object ?
For example,
Now create a function object first:
Now I have a function that takes this function object as a parameter, creates a packaged_task
and returns a future.
and later use this handle function as follows:
Can you please help me with the proper syntax for the future
as well as the packaged_task
declaration?
Thanks !
multithreading - std::packaged_task 和 std::function 的行为
我的问题来自C++11 中 ThreadPool 类的实现。以下是代码中的相关部分:
- 每当
enqueue
在 threadPool 对象上调用时,它会将传递的函数与所有传递的参数绑定,以创建 ashared_ptr
ofstd::packaged_task
:
future
从中提取std::packaged_task
以返回给调用者并将其存储task
在 a 中std::queue<std::function<void()>> tasks;
。在构造函数中,它等待队列中的任务,如果找到,则执行该任务:
现在,基于此,以下是我的问题:
如果
std::packaged_task
存储在 a 中std::queue<std::function<void()>>
,那么它就变成了一个std::function
对象,对吧?那么它如何仍然写入std::future
之前提取的共享状态?如果 stored
std::packaged_task
不只是一个std::function
对象,而且还是一个std::packaged_task
then 当 a通过 lambdastd::thread
执行task()
(构造函数中的代码),那么为什么它不在另一个线程上运行呢?std::packaged_task
应该在另一个线程上运行,对吗?
正如我的问题所暗示的那样,我无法理解 into 的std::packaged_task
转换std::function
以及std::function
写入std::future
. 每当我用 n 个线程测试这段代码时,我可以获得的最大线程 ID 数是 n,但不会超过 n。这是完整的代码(包括的代码,ThreadPool
它还包括一个计算创建的线程数的主函数)。
c++ - c++ std::packaged_task 调用抛出系统异常?
我从 cpprefernce.com 获得了一个非常简单的代码片段,如下所示:
一旦我在 ubuntu18.04 上使用 g++ 运行它,它就会打印:
那么程序哪里出错了,如何解决呢?
boost-asio - 我有错误它的含义:错误 C2440 'return': cannot convert from 'void (__cdecl &)(yield_context)' to 'void (&)(yield_context)'
我正在制作程序,在该程序中我尝试制作 boost packaged_task,然后将其未来放入向量中并使用 asio post 启动它。
当我尝试制作 packaged_task 时,它给了我这个错误:
这是相关代码:
这是 HTTPRequst::Execute 的定义:
并且 HTTPRequest 类派生自 enable_shared_from_this 。
错误在 bind.hpp 中,所以我在 vs 输出窗口中找到了包含代码部分的线索。
为什么会发生这个错误?解决方案是什么?
c++ - 移动捕获的 std::packaged_task 突然变为 const
因为我想给我的异步、反应器样式模式、回调一个来自 boost::asio 的未来形式的结果,我遇到了一个编译错误,即我不明白的 constness 冲突:
当我想调用一个打包任务以实现基本承诺时,即通过 lambda 使附加的未来做好准备,我得到了 constness 这个编译器错误。
task2
在我的 gcc 编译器上调用operator() 失败:
/home/markus/CLionProjects/untitled5/main.cpp:12:15:错误:不匹配调用'(const std::packaged_task) ()' 12 |
任务2();| ^ 在 /home/markus/CLionProjects/untitled5/main.cpp:1 中包含的文件中:/usr/include/c++/9.3.0/future:1548:7:注意:候选人:'void std::packaged_task<_Res( _ArgTypes ...)>::operator()(_ArgTypes ...) [with _Res = int; _ArgTypes = {}]' 1548 |
运算符()(_ArgTypes... __args) | ^~~~~~~~ /usr/include/c++/9.3.0/future:1548:7: 注意:将 'const std::packaged_task*' 作为 'this' 参数传递会丢弃限定符
如果我没看错的话,packaged_task 突然变成了一个 const,所以编译器错误,packed_task::operator() 方法没有被标记为 const。我在 task 和 task2 之间做的唯一一件事就是调用 move ctor packaged_task( packaged_task&& rhs ) noexcept;
,这应该 AFAIK 不会改变常量。显然我错过了一些必不可少的东西。
c++ - 我应该如何正确地将 packaged_task 移动到 lambda?
我一直在尝试将 packaged_task 捕获到 lambda 中,但我失败了。
我完全了解移动语义,还阅读了一些现代文学作品,我想我没有错过任何东西。我还阅读了 Josuttis 的移动语义书,以及ISO C++ 14 Language Extensions中关于广义 lambda 捕获和类似案例的 ISO 主题,
我有下一个代码:
在这里,我创建了简单的函数队列,包含一些“void ()”和 packaged_task,传递“int”返回类型的“f”。
然后我试图将 packaged_task 移动到 lambda 以便稍后在其他线程中使用它(我需要在其他线程中使用它,稍后将执行它,当'pack'将被销毁时,这就是为什么我不能作为参考)
似乎一切都很好,但是当我使用“g++ main.cpp -o main -std=c++14”(甚至使用 c++17)编译它时,g++ 告诉我:
/usr/include/c++/9/bits/std_function.h:176:6: 错误:使用已删除的函数'main()::::(const main()::&)'<br/> 176 | 新 _Functor(*__source._M_access());
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~
main.cpp:19:32: 注意:'main()::::(const main()::&)' 被隐式删除,因为默认定义格式不正确:
19 | q.emplace([p = std::move(pack)] () 可变 { p(); });
| ^
main.cpp:19:32:错误:使用已删除的函数 'std::packaged_task<_Res(_ArgTypes ...)>::packaged_task(const std::packaged_task<_Res(_ArgTypes ...)>&) [与_Res = int; _ArgTypes = {}]'<br/> 在 main.cpp:8 包含的文件中:
/usr/include/c++/9/future:1511:7:注意:
1511 | packaged_task(const packaged_task&) = 删除;
| ^~~~~~~~~~~~~
我也可以通过将它的副本传递给 lambda 来使用 shared_ptr 来解决这个问题,但是这种解决问题的方式似乎太难看了。那么,如果我试图移动它,为什么我在复制构造时会出错,我该如何解决呢?