我有一个小程序,我在OS课程的考试科目中找到。
void * func (void * p) {
int n = p;
printf("%d \n",n);
return NULL;
}
int main() {
int i;
pthread_t t[3];
for(i=0; i<3; i+=1)
pthread_create(&t[i] ,NULL, func, (void*)i);
return 0;
}
当我运行它时,我得到以下结果(每个数字后面有一个新行):
第一轮:0 0
第二轮:1 0 2 2
第3次运行:0 1 1
为什么在我只创建3个线程时会打印4位数字。它怎么打印重复?
代码在Ubuntu中用gcc编译。
答案 0 :(得分:7)
在退出main()之前,你没有加入你的线程。将以下内容添加到main()
:
for(i=0; i<3; i+=1)
pthread_join(t[i], NULL);
当程序退出时线程继续执行时,不加入线程会导致未定义的行为。未定义的行为可以自由地执行任何操作,包括打印重复项。
以这种方式思考,传递给线程的void*
存储在某个地方,一旦你提前退出main,就可能破坏数据传递给线程,此时它可以采用任何值(包括重复的值)。但这甚至不值得尝试解释,因为它是未定义的行为。
答案 1 :(得分:2)
return
函数的 main
相当于对exit
的调用,并终止整个过程。所以它或多或少随机的输出通过你的屏幕。您应该执行以下操作之一
pthread_exit
结束时致电main
,而不是致电exit
或使用return