【发布时间】:2022-01-10 22:15:53
【问题描述】:
我尝试实现一个打印每个线程号的函数。例如线程 0 打印 0 线程 1 打印 1 等等,但不是按照这个预期的顺序。
到目前为止我一直在尝试的是这个
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *foo(void *arg){
int *myid = (int*) arg;
printf("Hello from thread %d\n",*myid);
return NULL;
}
int main(void){
pthread_t tid[4];
int i;
for(i=0;i<4;i++){
pthread_create(&tid[i],NULL,(void*) foo, &i);
}
for(i=0;i<4;i++){
pthread_join(tid[i],NULL);
}
return 0;
}
但是,这几乎每次都会从线程 0 打印四次 Hello。如何修改此代码以便正确打印每个线程?
【问题讨论】:
-
不要从线程函数返回
NULL,使用pthread_exit -
您将循环索引的地址
i传递给foo。例如,如果在循环完成之后之前没有线程真正启动foo,会发生什么? -
@kiner_shah
pthread_exit()有助于将线程从更深层次的函数调用(不是顶级线程函数)中分离出来。它与任何地方的exit()与main()中的return相同。 -
@TedLyngmo,它真的在那里,奇怪的是我不知何故错过了它。
-
@kiner_shah 这是关于您的评论«否则没有该功能存在的意义»。如果 return 是离开线程的唯一选择,那么我们不能决定从该线程调用的另一个函数中离开该线程(我并不是说我会这样做,但
pthread_exit()存在这种可能性)。
标签: c multithreading