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