std :: packaged_task <t>的分配器构造函数

时间:2018-04-02 07:16:56

标签: c++ multithreading

std :: packaged_task模板有一个接受分配器的构造函数:

packaged_task pt {allocator_arg_t, a, f};

我想问:

1)它的存在表明packaged_task对象可能需要内存来存储数据。在容器(例如:矢量)的情况下,这种要求是显而易见的。但是,packaged_task不是容器。

如果'f'(作为参数传递给packaged_task的任务)需要空间,那么提供该空间的责任是'f'而不是packaged_task(否则'f'不会在packaged_task之外运行) )。

因此,为什么package_task需要这个构造函数?

2)什么是allocator_arg_t参数,为什么需要它以及如何使用它?

3)是否有(简单)用法示例?

1 个答案:

答案 0 :(得分:1)

自C ++ 17以来,该分配器感知重载已被删除。

packaged_task存储f的副本,该副本使用std::forward<F>(f)进行初始化。使用分配器a分配存储。此副本是必需的,因为packaged_task可能会超出原始f

std::allocator_arg_t纯粹用于消除构造函数的重载歧义。要选择支持allocator的构造函数,请将std::allocator_arg作为第一个参数传递。

示例(live):

#include <future>
#include <iostream>
#include <memory>

int one() noexcept {
  return 1;
}

int main() {
  std::packaged_task<int()> task(std::allocator_arg, std::allocator<void>{}, one);
  task();
  std::cout << task.get_future().get() << std::endl;
}

输出为1