Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 减少任务排队时的堆分配数_Multithreading_C++11_Boost Thread_Stdthread - Fatal编程技术网

Multithreading 减少任务排队时的堆分配数

Multithreading 减少任务排队时的堆分配数,multithreading,c++11,boost-thread,stdthread,Multithreading,C++11,Boost Thread,Stdthread,堆分配是我的应用程序中的一个瓶颈,我希望在将小任务发送到线程池时避免它们 我可以将std::packaged_任务与堆栈分配器一起使用吗?在什么条件下?这种选择的利弊是什么?是否有更好的替代方案来避免操作员对std::future的共享状态进行堆分配new auto foo() { arena<1024> buffer; auto task = std::packaged_task<int()>{ std::allocator_arg_t, ar

堆分配是我的应用程序中的一个瓶颈,我希望在将小任务发送到线程池时避免它们

我可以将
std::packaged_任务
与堆栈分配器一起使用吗?在什么条件下?这种选择的利弊是什么?是否有更好的替代方案来避免操作员对
std::future
的共享状态进行堆分配
new

auto foo() {
  arena<1024> buffer;
  auto task = std::packaged_task<int()>{
    std::allocator_arg_t, 
    arena_allocator{arena},
    []() -> int { return 5; } 
  };
  auto f = task.get_future();  // is this future and its shared state stack allocated?
  thread_pool.push_back(std::move(task)); 
  // I will probably need to block before the stack goes out of scope..
  return f.get();
}
auto-foo(){
竞技场缓冲区;
自动任务=标准::打包的任务{
std::分配器参数,
竞技场分配程序{arena},
[]()->int{return 5;}
};
auto f=task.get_future();//是否分配了此future及其共享状态堆栈?
线程池。推回(标准::移动(任务));
//我可能需要在堆栈超出范围之前进行阻止。。
返回f.get();
}
您的“我可能需要在堆栈超出范围之前进行阻止”评论清楚地指出了这里唯一的问题。您必须确保的唯一一件事是,由于发送线程堆栈中的任务,它必须留在那里,直到线程池执行它为止


除此之外,使用堆栈而不是堆分配也没有问题。

如果要阻止等待另一个线程完成任务,最好直接在此线程上运行任务。这似乎违背了拥有多个线程的全部意义。@IgorTandetnik我要确保计算在返回之前完成,但这并不意味着我要等待。这使我能够在另一个线程上运行某些计算时在此线程上执行其他操作,或者在多个线程上运行多个计算。它也让我在未来成长的过程中传递未来。。。或者甚至在分离的线程上执行计算,只要我确保它在共享状态所在的本地堆栈失效之前终止。