我想创建多个线程(下例中为 10 个)并让每个线程运行一个函数。
这是我的代码:
#include <stdio.h>
#include <pthread.h>
typedef struct arg_struct {
int id;
int val;
} arg_struct;
void *printarg(void *params) {
arg_struct *args = (arg_struct *) params;
printf("id %i value %i\n", args->id, args->val);
return 0;
}
int main() {
int i = 0;
pthread_t threads[10];
for (i = 0; i < 10; i++) {
arg_struct arg;
arg.id = i;
arg.val = i + 10;
pthread_create(&(threads[i]), NULL, &printarg, &arg);
}
for (i = 0; i < 10; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
我在执行过程中期待这样的输出:
id 0 value 10
id 1 value 11
id 2 value 12
id 3 value 13
id 4 value 14
id 5 value 15
id 6 value 16
id 7 value 17
id 8 value 18
id 9 value 19
但相反,我得到这样的输出:
id 2 value 12
id 3 value 13
id 3 value 13
id 4 value 14
id 6 value 16
id 6 value 16
id 9 value 19
id 9 value 19
id 9 value 19
id 9 value 19
每次我重新运行我的程序时,输出都会略有变化。id 和 value 重复,模式看起来不规则。
怎么了?重复发生是因为子线程也在 for 循环中创建线程吗?如果是这样,我会感到困惑,因为在我阅读的许多 pthread_create 示例中,人们似乎正在使用一个循环来迭代 N 次来创建 N 个线程(就像上面一样)。因此我假设上面的代码会有 1 个主线程创建 N 个子线程?我错了吗?提前致谢。