我正在学习线程编程,并且一直在运行测试练习,看看当你从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
我注意到一些类似主题的问题,但其他用户似乎都没有我所描述的问题。
答案 0 :(得分:2)
每个线程都有一个指向完全相同结构的指针。因此,它们将打印相同的值。你应该为for循环中的每个线程malloc()
一个新结构。
此外,args
被声明为file *args
。请注意,这已经是一个指针,因此您应该直接传递它而不是它的地址:
pthread_create(&threads[i], NULL, (void *)thread_run, (void *)args);