c - 线程终止问题(C 编程)

标签 c multithreading join posix pthreads

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

#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 函数终止需要多长时间。

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

提前致谢!

最佳答案

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

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

等待两个线程都终止。

编辑:如果您有一个子线程,而该子线程又创建了一个“孙子”线程,该怎么办?通常,无论是谁创建了线程,都应该等待它终止(“加入”它)。所以在这种情况下,子线程会在孙线程上调用phtread_join,而主线程会在子线程上调用join。

关于c - 线程终止问题(C 编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1725429/

相关文章:

java - 为什么不使用伪随机数生成器来生成测试数据呢?

php - 如何在后台休眠 PHP(Laravel 5.2)

MySql:将数据从一个表插入到另一个表

MySQL JOIN 从同一个表中获取多个条目

c# - 重命名计算机并在 C# 中重新启动一次加入域

c - 从文本文件中读取每个 float 并跳过 C 上的其余部分

c - 如何创建一个按字符添加字符的字符串

c - uint32_t 和其他 stdint 类型的 atoi 或 strtoul 等价物是什么?

c - 是否有预先存在的函数或代码可用于计算 POSIX 程序中的 TCP 段校验和

java - Thread[main,5,main] 和 Thread[Thread-77416,5,main] 有什么区别