为什么我在这个带有C(LINUX)线程的小程序中得到这些结果?

Sbi*_*dan 3 c linux pthreads

我有一个小程序,我在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编译.

终端的截图

Jar*_*edC 7

在退出main()之前,不要加入线程.将以下内容添加到main():

for(i=0; i<3; i+=1)
    pthread_join(t[i], NULL);
Run Code Online (Sandbox Code Playgroud)

当线程在程序退出时继续执行时,不加入线程会导致未定义的行为.未定义的行为可以自由执行任何操作,包括打印重复项.

以这种方式想一想,void*传递给线程的那个存储在某个地方,一旦你提前退出main,你可能会破坏数据传递给线程,此时它可以接受任何值(包括重复的值).但这甚至不值得尝试解释,因为它是未定义的行为.