Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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

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
C++ 让线程池中的所有线程执行给定的函数_C++_Multithreading_Threadpool - Fatal编程技术网

C++ 让线程池中的所有线程执行给定的函数

C++ 让线程池中的所有线程执行给定的函数,c++,multithreading,threadpool,C++,Multithreading,Threadpool,我使用稍微定制的progschj线程池实现()版本。到目前为止,它在我的用例中运行良好,后面描述的除外 我希望能够让池中的每个线程执行一次给定的函数,例如让每个线程设置一些线程局部变量 thread_pool.execute_all([](){do some stuff;}); 此调用应该是阻塞的,并等待池中的所有线程执行该函数 我试图修改线程的主循环以实现这一点,但我无法确保池中的每个线程只执行给定的函数一次,而主线程会等待它们完成 有人能提出这个功能的工作版本,或者给出一个如何实现的提示吗

我使用稍微定制的progschj线程池实现()版本。到目前为止,它在我的用例中运行良好,后面描述的除外

我希望能够让池中的每个线程执行一次给定的函数,例如让每个线程设置一些线程局部变量

thread_pool.execute_all([](){do some stuff;});
此调用应该是阻塞的,并等待池中的所有线程执行该函数

我试图修改线程的主循环以实现这一点,但我无法确保池中的每个线程只执行给定的函数一次,而主线程会等待它们完成


有人能提出这个功能的工作版本,或者给出一个如何实现的提示吗?

写一个计数信号量屏障

struct counting_barrier {
  explicit counting_barrier( std::ptrdiff_t c ):count(c) {}
  void operator--(int)& {
    this->operator--();
  }
  void operator--()& {
    auto l = lock();
    --count;
    cv.wait( l, [&]{
      return count<=0;
    } );
    cv.notify_all();
  }
private:
  std::unique_lock<std::mutex> lock()& {
    return std::unique_lock<std::mutex>(m);
  }
  std::condition_variable cv;
  std::mutex m;
  std::ptrdiff_t count = 0;
};
struct counting\u屏障{
显式计数屏障(std::ptrdiff_t c):计数(c){
无效运算符--(int)和{
这个->操作符--();
}
void运算符--(()&){
自动l=锁定();
--计数;
等速等待(l,[&]{

return countIt看起来不像
thread\u pool
有这样的功能。你是在问我们如何添加它吗?如果是的话,你是在问我们如何为你修改一个库。这会使你的问题脱离这个网站的主题。是的,我实际上试图将此功能添加到线程池中,但无法获得有效的解决方案。我希望有人ne可能认为这是一个有趣的问题,并且至少可以给出一些关于如何实现它的提示(使用此库或任何其他线程池实现)。似乎您必须稍微使用线程的
join
方法。难道
join
不是在等待线程停止吗?我不想停止线程,只想等待它们执行每个给定的函数。然后它们应该可以继续用于新任务。出于好奇,您想解决什么问题解决方案?编写关心线程池工作人员身份的代码似乎有点可疑。您现在使用的
thread\u pool
实现非常简单,但是如果您切换到更复杂的实现,那么您需要知道,线程池在需要时杀死工作人员是一种常见的做法低,并在需求增加时创建新的工作人员。非常感谢。它通过两个修改工作良好:
wait\u for
应该是
counting\u barrier::operator--
中的
wait
。由于我希望execute\u all函数等待线程全部调用该函数,因此我存储返回的
future
s通过
排队
并等待它们。@PierreKraemer当屏障减小到0时,所有的
f()
s已被调用。等待未来是多余的。哦,等等,你是对的,在屏障上添加一个;现在,
execute\u all
也在屏障上执行块。不需要两种同步!是的,与
workers.size()一起+1
计数初始化和主功能中的最后一个
--屏障
,可以:-)
template<class F>
void execute_all( F&& f ) {
  counting_barrier barrier(workers.size()+1);
  for (std::size_t i = 0; i < workers.size(); ++i) {
    enqueue([&]{
      f();
      --barrier;
    });
  }
  --barrier;
}