我有一个小程序,我在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;
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到以下结果(每个数字后面有一个新行):
第1次运行:0 0
次运行:1 0 2 2
第3次运行:0 1 1
当我只创建3个线程时,为什么它会打印4位数.它怎么打印重复?
该代码在Ubuntu中使用gcc编译.

在退出main()之前,不要加入线程.将以下内容添加到main():
for(i=0; i<3; i+=1)
pthread_join(t[i], NULL);
Run Code Online (Sandbox Code Playgroud)
当线程在程序退出时继续执行时,不加入线程会导致未定义的行为.未定义的行为可以自由执行任何操作,包括打印重复项.
以这种方式想一想,void*传递给线程的那个存储在某个地方,一旦你提前退出main,你可能会破坏数据传递给线程,此时它可以接受任何值(包括重复的值).但这甚至不值得尝试解释,因为它是未定义的行为.