从线程打印时的值不一致

时间:2016-11-15 03:37:54

标签: c multithreading

我正在学习线程编程,并且一直在运行测试练习,看看当你从pthread_create调用一个函数时它是如何工作的,但是,这样做时我得到了奇怪的结果。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

pthread_t *threads;

typedef struct _file {
    int num1;
    int num2;
} file;

void thread_run(void *thing) {
    file *fp = thing;

    printf("num1: %d num2: %d\n", fp->num1, fp->num2);

}

int main(int argc, char **argv) {

    threads = (pthread_t *)malloc(atoi(argv[1]));

    file *args = malloc(sizeof(file));
    args->num1 = 0;
    args->num2 = 0;
    int i;
    for (i = 0; i < atoi(argv[1]); i++) {
        args->num1 = i;
        args->num2 = i + 1;
        pthread_create(&threads[i], NULL, (void *)thread_run, (void *)&args); // the (void *) cast is necessary on my linux distro
    }

    for (i = 0; i < atoi(argv[1]); i++) {
        pthread_join(threads[i], NULL);
    }

    return 0;
}

我在这里尝试的是当我在for循环中创建线程时,我将它们全部存储在我的* threads指针中。

然后我用一个struct参数调用方法thread_run,该参数包含我打印出来的两个整数值。

据我所知,使用 ./ a.out 3 运行时,此程序的预期输出应为:

num1: 0 num2: 1
num1: 1 num2: 2
num1: 2 num2: 3

但是,我得到的输出每次都有所不同,但通常与以下内容一致:

num1: 34185264 num2: 0
num1: 34185264 num2: 0
num1: 34185264 num2: 0

我注意到一些类似主题的问题,但其他用户似乎都没有我所描述的问题。

1 个答案:

答案 0 :(得分:2)

每个线程都有一个指向完全相同结构的指针。因此,它们将打印相同的值。你应该为for循环中的每个线程malloc()一个新结构。

此外,args被声明为file *args。请注意,这已经是一个指针,因此您应该直接传递它而不是它的地址:

pthread_create(&threads[i], NULL, (void *)thread_run, (void *)args);