线程终止问题(c编程)

时间:2009-11-12 21:09:10

标签: c multithreading join posix pthreads

我正在研究使用多线程的C语言Linux应用程序。由main函数生成的线程完成大部分工作,因此通常最后完成。我看到一些奇怪的行为,我相信这是由于主线程在生成的线程有机会完成其工作之前终止。这里有一些示例代码来说明我在说什么:

#define _POSIX_C_SOURCE 200112L
#define _ISOC99_SOURCE
#define __EXTENSIONS__
#define _GNU_SOURCE

#include <pthread.h>
#include <stdio.h>

void
my_cleanup(void *arg)
{
     printf("cleanup: %s\n", (char *)arg);
}


void *
thread_stuff(void *arg)
{
     printf("thread started\n");
     pthread_cleanup_push(cleanup, "running");
     if (arg)
          pthread_exit((void *)2);
     pthread_cleanup_pop(0);
     pthread_exit((void *)2);
}


int
main()
{
     int err;
     pthread_t tid1, tid2;

     err = pthread_create(&tid1, NULL, thread_stuff, (void *)1);
     err = pthread_create(&tid2, NULL, thread_stuff, (void *)1);

     sleep(10);                 /* change the value here if you want */

     return SUCCESS;
}

当运行此代码时,来自清理功能的消息将按原样打印两次,但有时它运行时,我看到有时只打印一次消息,有时我看到打印三次或者根本没有。您可以在main函数中添加sleep函数来播放main函数终止所需的时间。

我该怎么做才能让程序按原样运行?我怀疑它与加入孩子有关,但我并不完全理解加入的概念或如何将其应用于这种情况。

提前致谢!

3 个答案:

答案 0 :(得分:3)

是的,你应该“加入”线程。 “加入”一个线程只是意味着等待线程终止。换句话说,你会做

pthread_join(tid1, NULL);
pthread_join(tid2, NULL);

等待两个线程都终止。

编辑:如果你有一个子线程,然后创建一个“孙子”线程怎么办?通常,创建线程的人应该等待它终止(“加入”它)。所以在这种情况下,子线程会在孙子线程上调用phtread_join,主线程会在子线程上调用join。

答案 1 :(得分:2)

我认为你想在主线程完成时在每个线程上运行pthread_join - 这使得主线程停止,直到给定的线程完成运行。其他线程仍然可以先完成,因此在每个线程上运行pthread_join将阻止主线程终止,直到所有其他线程终止。

答案 2 :(得分:1)

如果你没有显式调用pthread_exit(),那么如果main()在它产生的线程之前完成,那么肯定存在问题。它创建的所有线程都将终止,因为main()已完成且不再存在以支持线程。

通过让main()显式调用pthread_exit()作为它做的最后一件事,main()将阻塞并保持活动状态以支持它创建的线程,直到它们完成。

int main()
    {
         int err;
         pthread_t tid1, tid2;

         err = pthread_create(&tid1, NULL, thread_stuff, (void *)1);
         err = pthread_create(&tid2, NULL, thread_stuff, (void *)1);

         sleep(10);                 /* change the value here if you want */

         /* Add the pthread_exit */     
         pthread_exit(NULL);
         return SUCCESS;
    }

请参阅更多信息here

相关问题