c - 停止线程池运行的好方法是什么?

标签 c multithreading memory-leaks threadpool exit

最近在做一个项目,需要管理一对线程池。 池中的工作线程所做的基本上是对每个队列执行某种弹出操作,如果队列中没有可用值,最终等待条件变量 (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/

相关文章:

java - Java中锁定一个类的所有实例

haskell - 为什么我的程序使用这么多内存?

c# - 线程安全事件调用

Python:线程无故停止

c++ - 为什么 Xcode + Instrument Leaks 没有在简单的 C++ 程序中检测到这种泄漏

ios - 避免在 NSManagedObjectContext 中注册对象堆积(memleak)

C 代码未定义行为 - 在 func 中重新分配结构

c - 错误 : Bad address when using sendto() in raw sockets

C语言: change user input

c - 如何在 C 中使用 "popen"写入和读取同一文件