c - 如果多个线程加入一个线程,为什么它是未定义的?

标签 c linux multithreading pthreads

如果我有多个线程并且我想等待一个线程完成,为什么根据 pthread_join() 函数这是未定义的?

例如,下面的代码显示线程 1 和 2 等待线程 0:

void* thread1(void* t1){
..
pthread_join(pthread_t thread0, void **retval1);
return NULL
}

void* thread2(void* t2){
..
pthread_join(pthread_t thread0, void **retval2);
return NULL
}

为什么这种行为是未定义的或者换句话说是不可能的?

最佳答案

pthread_t 对象通常会指向一些与线程相关的已分配数据。这些数据通常是线程的返回值。 pthread_join 将读取返回值并释放线程数据。

如果你pthread_join相同的pthread id两次,你就遇到了双重释放的情况。指向的数据可能在第二次连接时无效,但也可能被另一个线程以不可预测的方式重用。

结果很难/不可能推理。因此,UB。

关于c - 如果多个线程加入一个线程,为什么它是未定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57873476/

相关文章:

java - 另一个应用程序的 Windows 状态。使用 Java (Ubuntu) 处理

linux - 有权读写和删除文件夹中的文件,但不能读写和删除文件夹本身

linux - Linux 上的 Logstash 文件输入延迟

python - 用线程 boost python

android - java.lang.IllegalStateException : Calling View methods on another thread than the UI thread 错误

java - 从Java执行C时出现奇怪的错误

c++ - 以编程方式 LD_PRELOAD

单处理器中的多线程

c++ - 在内联汇编中访问 C 结构成员

c - 在计算器程序中使用 ASCII 转换进行编程