线程终止问题(c编程)

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

#define _POSIX_C_SOURCE 200112L #define _ISOC99_SOURCE #define __EXTENSIONS__ #define _GNU_SOURCE #include  #include  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; } 

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

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

提前致谢!

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

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

等待两个线程都终止。

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

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

如果main()在它产生的线程之前完成,如果你没有显式调用pthread_exit(),那么肯定存在问题。 它创建的所有线程都将终止,因为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; } 

请在此处参阅更多信息