为什么 pthread_join 不阻塞并等待线程完成?
Why pthread_join does not block and wait for the thread to finish?
#include <stdio.h>
#include <pthread.h>
void* thread(void *v) {
printf("The thread starts now\n");
//pthread_exit(NULL);
}
int main() {
int tid1;
int retValue = 0;
pthread_create(&tid1, NULL,thread, NULL);
retValue = pthread_join(tid1, NULL);
printf("Thread ID: %d, return value: %d\n",tid1, retValue);
retValue = pthread_join(tid1, NULL);
printf("Thread ID: %d, return value: %d\n",tid1, retValue);
return 0;
}
有时输出是:
Thread ID: 1877241856, return value: 3
Thread ID: 1877241856, return value: 3
The thread starts now
Process finished with exit code 0
问题是:
根据定义,pthread_join
应该阻塞,等待thread
执行完毕,再执行后面的代码。但为什么在我的代码中,thread
在两个 pthread_join
完成后运行?
根据定义,pthread_join
returns 0表示加入成功,但是为什么我代码的retValue
总是3,是否thread
在 pthread_join
函数之前或之后运行?
此代码中存在许多错误:
pthread_create()
的第一个参数应该是 pthread_t
,而不是 int
。它们的大小很可能不同,或者可以互换,因此 tid1
可能不是有效的 pthread id。
线程不 return 0,或与此相关的任何其他值。没有 return
声明。
“成功时,pthread_join() returns 0;错误时,returns 是一个错误号。”
线程的 return 值(如果有的话)将被放入 pthread_join()
的未使用的第二个参数中。被视为 return 值的实际上是 pthread_join()
调用本身的结果。这是一个错误。也许与上面的#1 有关?
除了 TrentP 发现的那些之外,最严重的错误是
Joining with a thread that has previously been joined results in undefined behavior.
即在同一线程上调用 pthread_join
两次
retValue = pthread_join(tid1, NULL);
retValue = pthread_join(tid1, NULL);
是完全错误的,说如果将 tid1
更改为 pthread_t
就有效是错误的。未定义的行为意味着第二次调用 pthread_join
时可能发生任何事情 - pthread_join
可以 return 出错,pthread_join
可以 return 成功,它可以崩溃,它可以挂起,它可以修改内存的其他部分,它可以导致启动一个新线程...
#include <stdio.h>
#include <pthread.h>
void* thread(void *v) {
printf("The thread starts now\n");
//pthread_exit(NULL);
}
int main() {
int tid1;
int retValue = 0;
pthread_create(&tid1, NULL,thread, NULL);
retValue = pthread_join(tid1, NULL);
printf("Thread ID: %d, return value: %d\n",tid1, retValue);
retValue = pthread_join(tid1, NULL);
printf("Thread ID: %d, return value: %d\n",tid1, retValue);
return 0;
}
有时输出是:
Thread ID: 1877241856, return value: 3
Thread ID: 1877241856, return value: 3
The thread starts now
Process finished with exit code 0
问题是:
根据定义,
pthread_join
应该阻塞,等待thread
执行完毕,再执行后面的代码。但为什么在我的代码中,thread
在两个pthread_join
完成后运行?根据定义,
pthread_join
returns 0表示加入成功,但是为什么我代码的retValue
总是3,是否thread
在pthread_join
函数之前或之后运行?
此代码中存在许多错误:
pthread_create()
的第一个参数应该是pthread_t
,而不是int
。它们的大小很可能不同,或者可以互换,因此tid1
可能不是有效的 pthread id。线程不 return 0,或与此相关的任何其他值。没有
return
声明。“成功时,pthread_join() returns 0;错误时,returns 是一个错误号。” 线程的 return 值(如果有的话)将被放入
pthread_join()
的未使用的第二个参数中。被视为 return 值的实际上是pthread_join()
调用本身的结果。这是一个错误。也许与上面的#1 有关?
除了 TrentP 发现的那些之外,最严重的错误是
Joining with a thread that has previously been joined results in undefined behavior.
即在同一线程上调用 pthread_join
两次
retValue = pthread_join(tid1, NULL);
retValue = pthread_join(tid1, NULL);
是完全错误的,说如果将 tid1
更改为 pthread_t
就有效是错误的。未定义的行为意味着第二次调用 pthread_join
时可能发生任何事情 - pthread_join
可以 return 出错,pthread_join
可以 return 成功,它可以崩溃,它可以挂起,它可以修改内存的其他部分,它可以导致启动一个新线程...