最近在做一个项目,需要管理一对线程池。
池中的工作线程所做的基本上是对每个队列执行某种弹出操作,如果队列中没有可用值,最终等待条件变量 (pthread_cond_t
),一旦它们获取一个项目,解析它并相应地执行操作。
我担心的是我不想有内存泄漏,为了实现这一点,我注意到在主进程退出时在每个线程上调用 pthread_cancel
绝对是个坏主意,因为它会在周围留下很多垃圾。
关键是,我的第一个想法是使用一个退出标志,我可以在线程需要退出时设置它,以便它们可以轻松释放内存并调用 pthread_exit
...
我想我应该设置这个标志,然后向等待条件变量的线程发送一个广播信号,并在弹出操作后立即检查标志...
这真的是实现线程池终止的正确方法吗?对此我没有太大的信心... 我在这里写一些伪代码来解释我在说什么
每个池线程将运行一些结构如下的代码:
/* Worker thread (which will run on each pool thread) */
{ /* Thread initialization */ ... }
loop {
value = pop();
{ /* Mutex lock because of the shared flag */ ... }
if (flag) {{ /* Free memory and unlock mutex */ ... } pthread_exit(); }
{ /* Unlock the mutex */ ... }
{ /* Elaborate value */ ... }
}
return NULL;
并且会有某种 pool_stopRunning()
函数,它看起来像:
/* pool_stopRunning() function code */
{ /* Acquire flag mutex */ ... }
setFlag(flag);
{ /* Unlock flag mutex */ ... }
{ /* Acquire queue mutex */ ... }
pthread_cond_broadcast(...);
{ /* Unlock queue mutex */ ... }
提前致谢,我只需要确保没有更高级的方法来停止线程池...(或了解更好的方法,无论如何) 一如既往,如果有任何打字错误,我很抱歉,我不是说英语的人,现在有点晚了 >:
最佳答案
您所描述的内容会起作用,但我建议采用不同的方法...
您已经有了一种将任务分配给线程的机制,并完成了所有适当的同步。因此,与其使用一些新的并行机制使设计复杂化,不如定义一种称为“STOP”的新型任务。如果有 N
个线程在为队列服务,而您想要终止它们,请将 N
STOP 任务推送到队列中。然后等待所有线程终止。 (这最后一个可以通过“加入”完成,因此它也不需要任何新机制。)
没有困惑,没有大惊小怪。
关于c - 停止线程池运行的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44980711/