我最近在uni项目上工作,我需要管理一对线程池。 池中的工作线程所做的基本上是对每个相应的队列执行某种类型的弹出操作,如果队列中没有可用的值,最终等待条件变量(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 */ ... }
谢谢,我只是需要确保有没有看中-ER办法阻止一个线程池。 ..(或者有机会认识更好的方法) 一如既往,对不起,如果有任何错字,我不是和英文扬声器,它现在是一种晚了>:
有必要使用互斥锁来保护国旗。但尽量减少互斥锁的时间。例如,在线程中,复制标志值并释放互斥锁,然后在复制标志值如此说明的情况下退出。不管你做什么,干净的线程终止都需要主线程和其他线程之间的协作,如果涉及到任何共享状态的话。 – Peter
我可能会研究这个https://github.com/Pithikos/C-Thread-Pool/blob/master/thpool.c,查看destroy函数内部,以了解这个lib如何实现它。 – n3wb
首先,你需要这样做吗?如果您只是在进程终止时删除池,那么在Linux/Windows等主流多任务操作系统上,您不需要发出信号/停止/终止任何事情,除非有迫切需要。在停止线程方面,操作系统要比用户代码好得多,(用户代码无法停止在请求停止的线程在另一个内核上运行的线程)。我怀疑过早的停止优化... – ThingyWotsit