程序终止时清理pthread资源

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序终止时清理pthread资源相关的知识,希望对你有一定的参考价值。

我用pthread创建了一个线程。我的工作程序是一个无限循环。当我的主程序退出时,终止和清理pthread的所有资源的设计模式是什么?

pthread_create(&thread, NULL, worker, NULL);

void* worker(void* arg){

while(true){

 //do something
}

}

谢谢

答案

我通常有一个全局变量,初始化为true,当你希望线程退出并从主函数连接到线程时,设置为false。下面的伪代码:

global isRunning = true

def main:
    isRunning = true
    id1 = startThread (worker)
    id2 = startThread (worker)
    id3 = startThread (worker)
    joinThread (id1)
    joinThread (id2)
    joinThread (id3)
    exit

def worker:
    initialiseWorker()
    while isRunning:
          # something in here (or a signal handler) will
          #  set isRunning to false.
          doSomeWork()
    terminateWorker()

并确保线程及时地执行该循环,以便它们可以检测它们何时应该退出。如果他们有长期工作,你需要定期检查doSomeWork()。我做了一般规则,线程应该在被告知的五秒钟内退出。

我不会从外面杀死线程。可以引入的问题太多了。全局标志方法允许每个线程控制自己,因为它通常是唯一知道什么时候可以安全地退出干净的线程。

另一答案

除了检查交换机,全局或其他,pthreads有自己的取消机制。看看pthread_cancel()pthread_setcancelstate()pthread_setcanceltype()pthread_testcancel()pthread_cleanup_push()等。

基本思想是工作线程创建(或使用现有)取消点。如果取消,则在退出之前调用线程的推送清理处理程序以清理资源。

另一答案

当您的主程序退出时,所有线程也会退出。这意味着只有一个线程调用exit()(或者如果主例程终止),那么其他线程将退出。

你不能只是杀死线程。如果你杀死正在工作的线程,那么最多会出现内存泄漏,最糟糕的是你会遇到死锁。无论哪种方式,它都不漂亮。

在最后一个线程退出时(或者如果任何线程调用exit()),将清除在进程终止时清理的所有资源。这包括内存(不包括共享内存,例如posix或sysv),类文件对象(如果没有其他进程具有开放描述符)和一些其他类型的对象。

任何其他持久的东西(例如临时文件,某些类型的共享内存),你需要在退出之前自己清理,或者在下一次运行开始时(更健壮)。

另一答案

所有线程都应该由它们自己出来,否则你必须手动清理它们。在第一种方法中,您将不得不使用一些全局变量,该变量将使用锁来保护线程以告知线程停止执行。这样的东西将在每个线程中的while(true)循环内。

while(true)  
{  
  GetLock(SomeGlobalVariable);  
  if(SomeGlobalVariable == true)  
   {  
    unlock(SomeGlobalVariable);   
    break;  
   }  
unlock(SomeGlobalVariable);   
} 

在第二种方法中,您必须跟踪在数组中创建的所有threadIds,然后在退出时逐个删除所有这些ID。

如果您的程序将使用许多线程,那么您最好选择线程池。在线程池中,您可以在程序开头创建一些线程,然后在需要时给出线程,并在完成工作时返回线程资源。

有这个库。例如http://threadpool.sourceforge.net/

以上是关于程序终止时清理pthread资源的主要内容,如果未能解决你的问题,请参考以下文章

C语言 pthread_cleanup_push()和pthread_cleanup_pop()函数(用于临界资源程序段中发生终止动作后的资源清理任务,以免造成死锁,临界区资源一般上锁)

进程是不是会在退出时自动清理 pthreads 占用的资源

您需要加入已取消的线程吗? (线程)

使用pthread时,字节仍可访问

异常进程终止时的资源清理

Qt系列文章之三十四 (线程题外话---从pthread 到QThread)