- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在分析以下代码片段并试图详细理解它:
template<typename FUNCTION, typename... ARGUMENTS>
auto ThreadPool::add( FUNCTION&& Function, ARGUMENTS&&... Arguments ) -> std::future<typename std::result_of<FUNCTION(ARGUMENTS...)>::type>
{
using PackedTask = std::packaged_task<typename std::result_of<FUNCTION(ARGUMENTS...)>::type()>;
auto task = std::make_shared<PackedTask>(std::bind(std::forward<FUNCTION>(Function), std::forward<ARGUMENTS>(Arguments)...));
// get the future to return later
auto ret = task->get_future();
{
std::lock_guard<std::mutex> lock{jobsMutex};
jobs.emplace([task]() { (*task)(); });
}
// let a waiting thread know there is an available job
jobsAvailable.notify_one();
return ret;
}
关于 std::packaged_task
我几乎没有问题.
正如您在 add(...)
中看到的那样方法体,std::packaged_task
的实例- task
是局部变量,其作用域在方法执行结束时结束。返回值ret
的 std::future
类型由拷贝返回。 ret
的值给出了 task
(这是本地的)。所以一旦方法执行完成,task
超出范围,所以我预计返回的连接的 std::future 实例变得无效,我的理解正确吗?
在方法执行期间,线程中要执行的任务方法被放置到std::queue<Job> jobs
中.为什么只有指针指向operator()
的 std::packaged_task
其中包含对 Function
的引用作为 std::queue
中的方法参数给出?我希望直接存储 std::packaged_task
为了保存对正在创建的实例的引用...?
无论如何,源代码片段来自 ThreadPool 实现,可以在这里找到 https://github.com/dabbertorres/ThreadPool并且似乎正在充分发挥作用。所以我认为它是正确的但不幸的是我并不完全清楚......如果有人能解释这些东西是如何工作的我会很高兴......
非常感谢任何愿意提供帮助的人。干杯马丁
最佳答案
As you can see in the add(...) method body, the instance of std::packaged_task - task is local variable which scope ends with the end of the method execution.
是的,它是std::shared_ptr<PackedTask>
的一个局部变量.当它超出范围时,它会将引用计数减 1。如果新的引用计数为 0,它会删除它指向的对象。幸运的是,jobs
持有该共享指针的拷贝,以便指向对象保持事件状态。
The return value ret of std::future type is returned by copy.
不完全是。 ret
更有可能通过移动而不是通过复制返回。
the task goes out of scope and so I expect the connected std::future instance being returned becomes invalid, is my understanding correct?
再次,task
是共享指针。 jobs
队列使它保持事件状态,并且可能 ret
持有该共享指针的另一个拷贝(实际提取 task
的结果)。因此,只要任务在队列中并且有人掌握该结果的 future ,就没有什么是无效的。
I would expect to store directly the std::packaged_task in order to hold the reference to the instance being created...?
没错,它本可以存储 std::packaged_task
直接地。我的猜测是这个库的作者不想搞乱不可复制/不可移动的仿函数。如果 std::bind
的结果是不可复制的和不可移动的,你不能真正移动std::packaged_task
进入队列。使用共享指针解决了这个问题,因为您不复制/移动 packaged_task 本身,只复制/移动指针。然而,您可以将任务对象直接构建到队列中,但是在持有锁的情况下进行这并不是一个好的做法。
不过我同意,这可能会移动 task
进入 lambda 比复制它更有效。
关于c++ - std::packaged_task 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46661995/
我正在开发一个小型图书馆,我需要做的一件事是让访问者访问一些数据并返回结果。 在一些较旧的 C++ 代码中,访问者需要声明一个 typedef return_type .例如,boost::stati
我正在尝试使用std:map类型的键和值制作std::any Visual Studio 2017 std::map m("lastname", "Ivanov"); std::cout (m["la
我已经在 C++ 的 map 中声明了一个集合为 std::map> .如何循环访问或打印设定值? 最佳答案 如果你知道如何迭代 std::map或 std::set单独地,您应该可以毫无问题地组合迭
如何循环? 我已经试过了: //----- code std::vector >::iterator it; for ( it = users.begin(); it != users.end();
我有两个用例。 A.我想同步访问两个线程的队列。 B.我想同步两个线程对队列的访问并使用条件变量,因为其中一个线程将等待另一个线程将内容存储到队列中。 对于用例 A,我看到了使用 std::lock_
我正在查看这两种类型特征的文档,但不确定有什么区别。我不是语言律师,但据我所知,它们都适用于“memcpy-able”类型。 它们可以互换使用吗? 最佳答案 不,这些术语不能互换使用。这两个术语都表示
我有以下测试代码,其中有一个参数 fS,它是 ofstream 的容器: #include #include #include #include int
这是这个问题的延续 c++ function ptr in unorderer_map, compile time error 我试图使用 std::function 而不是函数指针,并且只有当函数是
std::unordered_map str_bool_map = { {"a", true}, {"b", false}, {"c", true} }; 我们可以在此映射上使
我有以下对象 std::vector> vectorList; 然后我添加到这个使用 std::vector vec_tmp; vec_tmp.push_back(strDRG); vec_tmp.p
为什么 std::initializer_list不支持std::get<> , std::tuple_size和 std::tuple_element ?在constexpr中用得很多现在的表达式,
我有一个像这样定义的变量 auto drum = std::make_tuple ( std::make_tuple ( 0.3f , Ex
假设我有一个私有(private)std::map在我的类(class)里std::map 。我怎样才能将其转换为std::map返回给用户?我想要下面的原型(prototype) const std
假设我有一个私有(private)std::map在我的类(class)里std::map 。我怎样才能将其转换为std::map返回给用户?我想要下面的原型(prototype) const std
问题 我正在尝试将 lambda 闭包传递给 std::thread,它使用任意封闭参数调用任意封闭函数。 template std::thread timed_thread(Function&& f
我想创建一个模板类,可以容纳容器和容器的任意组合。例如,std::vector或 std::map ,例如。 我尝试了很多组合,但我必须承认模板的复杂性让我不知所措。我编译的关闭是这样的: templ
我有一个 std::vector>我将其分配给相同类型的第二个 vector 。 我收到这个编译器错误: /opt/gcc-8.2.0/include/c++/8.2.0/bits/stl_algob
有时候,我们有一个工厂可以生成一个 std::unique_ptr vector ,后来我们想在类/线程/你命名的之间共享这些指针。因此,最好改用 std::shared_ptr 。当然有一种方法可以
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 6 年前。 我创建了一个 vector vector ,我想根据我定义的参
我有三个类(class)成员: public: std::vector > getObjects(); std::vector > getObjects() const; privat
我是一名优秀的程序员,十分优秀!