我使用pthread创建了一个线程。我的工作程序是一个无限循环。当我的主程序退出时,终止和清理pthread的所有资源的设计模式是什么?
pthread_create(&thread, NULL, worker, NULL);
void* worker(void* arg){
while(true){
//do something
}
}
由于
答案 0 :(得分:0)
所有线程都应该由他们自己退出,否则你必须手动清理它们。在第一种方法中,您将不得不使用一些全局变量,该变量将使用锁来保护线程以告知线程停止执行。这样的东西将在每个线程中的while(true)循环内。
while(true)
{
GetLock(SomeGlobalVariable);
if(SomeGlobalVariable == true)
{
unlock(SomeGlobalVariable);
break;
}
unlock(SomeGlobalVariable);
}
在第二种方法中,你必须跟踪你在数组中创建的所有threadIds,然后在退出时逐个杀死所有这些id。
如果你的程序要使用很多线程,那么你最好去线程池。在线程池中,您可以在程序开头创建一些线程,然后在需要时给出线程,并在完成工作时返回线程资源。
有这样的图书馆。例如http://threadpool.sourceforge.net/
答案 1 :(得分:0)
我通常有一个全局变量,初始化为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()
内进行检查。我做了一般规则,线程应该在被告知的五秒钟内退出。
我永远不会从外部杀死线程。可以引入的问题太多了。全局标志方法允许每个线程控制自己,因为它通常是唯一知道何时可以安全地完全退出的线程。
答案 2 :(得分:0)
除了检查交换机,全局或其他方面,pthreads还有自己的取消机制。请查看pthread_cancel(),pthread_setcancelstate(),pthread_setcanceltype(),pthread_testcancel(),pthread_cleanup_push()等。
基本思想是工作线程创建(或使用现有)取消点。如果取消,则在退出之前调用线程的推送清理处理程序以清理资源。
答案 3 :(得分:0)
当您的主程序退出时,所有线程也会退出。这意味着只有一个线程调用exit()(或者如果主例程终止),那么其他线程将退出。
你不能只是杀死线程。如果你杀死正在工作的线程,那么最多会出现内存泄漏,最糟糕的是你会遇到死锁。无论哪种方式,它都不漂亮。
当最后一个线程退出时(或者如果任何线程调用exit()),将清除在进程终止时清除的所有资源。这包括内存(不包括共享内存,例如posix或sysv),类文件对象(如果没有其他进程具有开放描述符)和一些其他类型的对象。
任何其他持久的东西(例如临时文件,某些类型的共享内存),你需要在退出之前自己清理,或者(在下次运行开始时更健壮)。