3

我有一个在操作系统课程的考试科目中发现的小程序。

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
第三次运行:0 1 1

为什么当我只创建 3 个线程时它会打印 4 个数字。它如何打印重复项?

代码在 Ubuntu 中使用 gcc 编译。

终端截图

4

2 回答 2

7

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

for(i=0; i<3; i+=1)
    pthread_join(t[i], NULL);

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

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

于 2013-01-27T23:40:48.170 回答
2

returnfrommain函数相当于调用exit并终止整个过程。所以它或多或少是随机的,哪个输出可以通过你的屏幕。您应该执行以下操作之一

  • 加入您创建的所有线程
  • pthread_exit在结束时调用main而不是调用exit或使用return
于 2013-01-27T23:45:05.960 回答