我正在学习如何使用<pthread.h>,课本上说:

函数pthread_join会阻塞调用线程...

但在我的测试中,它没有:

void *a_thread(void *pt) {
  puts("a_thread:join");
  pthread_join(*(pthread_t *)pt, NULL); // <-- a_thread didn't wait for
  puts("a_thread:joined");              //     itself to finish executing.

  return NULL;
}

int main(void) {
  pthread_t t;

  puts("create");
  pthread_create(&t, NULL, a_thread, &t);
  puts("created");

  puts("main:join");
  pthread_join(t, NULL);
  puts("main:joined");
}

gcc -Og -o test test.c; ./test:

create
created
main:join
a_thread:join
a_thread:joined
main:joined

推荐答案

pthread_join man page人开始:

如果多个线程同时try 联接同一个线程,则结果是未定义的.

在这里,工作线程和主线程都试图加入工作线程,对我来说,这听起来像UB.

C++相关问答推荐

如何从TPS特定的TGPT_PUBLIC数据 struct 中以OpenSSL的EVP_PKEY

将指针作为参数传递给函数

核心转储文件中出现奇怪的大小变化

ARM64 ASIMD固有的加载uint8_t* 到uint16x8(x3)?

Linux不想运行编译后的文件

Char变量如何在不使用方括号或花括号的情况下存储字符串,以及它如何迭代到下一个字符?

VS代码';S C/C++扩展称C23真关键字和假关键字未定义

理解C版宏(看起来像未声明的变量?)

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

使用TCL C API导航到列表中的元素

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

为什么realloc函数在此代码中修改变量?

C语言中的数字指针

C标准关于外部常量的说明

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

如何在zOS上编译共享C库

如何修复我的qsort()算法?它每次都给出不同的结果

c程序,让用户输入两类数字,并给出输出用户输入多少个数字

如何不断地用C读取文件?

如何向 execl 创建的后台程序提供输入?