C++ 程序终止时清理pthread资源

C++ 程序终止时清理pthread资源,c++,linux,pthreads,C++,Linux,Pthreads,我已经使用pthread创建了一个线程。我的工作例程是一个无限循环。当我的主程序退出时,终止并清理pthread所有资源的设计模式是什么 pthread_create(&thread, NULL, worker, NULL); void* worker(void* arg){ while(true){ //do something } } 谢谢所有线程都应该自行退出,否则您必须手动清理它们。在第一种方法中,您必须使用一些全局变量,这些变量将使用锁来保护,以通知线程停止执行。每

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

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

void* worker(void* arg){

while(true){

 //do something
}

}

谢谢

所有线程都应该自行退出,否则您必须手动清理它们。在第一种方法中,您必须使用一些全局变量,这些变量将使用锁来保护,以通知线程停止执行。每个线程中的while(true)循环中都会有类似的内容

while(true)  
{  
  GetLock(SomeGlobalVariable);  
  if(SomeGlobalVariable == true)  
   {  
    unlock(SomeGlobalVariable);   
    break;  
   }  
unlock(SomeGlobalVariable);   
} 
在第二种方法中,您必须跟踪在数组中创建的所有ThreadID,然后在退出时逐个杀死所有这些ID

如果您的程序要使用多个线程,那么最好使用线程池。在线程池中,您在程序开始时创建一些线程,然后在需要时提供线程,当工作完成时,返回线程资源


这里有图书馆。e、 g.

我通常有一个全局变量,当您希望线程退出并从主函数连接到线程时,该变量被初始化为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有自己的取消机制。看看,,,等等


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

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

你不能只杀死线程。如果你杀死了正在工作的线程,那么充其量只能得到一个内存泄漏,而最坏的情况只能得到一个死锁。不管怎样都不好看

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

任何其他持久性的内容(例如临时文件、某些类型的共享内存),您需要在退出之前或在下一次运行开始时(更稳健地)清理自己