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

时间:2013-01-27 23:28:13

标签: 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;
}

当我运行它时,我得到以下结果(每个数字后面有一个新行):

  

第一轮:0 0
  第二轮:1 0 2 2
  第3次运行:0 1 1

为什么在我只创建3个线程时会打印4位数字。它怎么打印重复?

代码在Ubuntu中用gcc编译。

screenshot of the terminal

2 个答案:

答案 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