gpt4 book ai didi

C 线程 (pthread_create) 未按预期工作

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:57 26 4
gpt4 key购买 nike

我想创建多个线程(下例中为 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 的 & 值的重复和模式似乎不规则。

发生了什么事?重复发生是因为子线程也在 for 循环中创建线程吗?如果是这样,我很困惑,因为在我阅读的许多 pthread_create 示例中,人们似乎在使用循环迭代 N 次来创建 N 线程(与上面完全一样)。因此我假设上面的代码会有 1 个主线程创建 N 个子线程?我错了吗?提前致谢。

最佳答案

每个线程都被传递一个指向在循环内声明的 arg_struct 的指针,它在每次迭代时重新创建。如果在您退出循环之前没有任何线程执行,那么它们在技术上引用了一个超出范围的变量。即使它没有超出范围(假设您在 main 的顶部声明它),他们都会看到您放置在那里的最终值。从您的轨迹来看,似乎线程开始于相对于循环的随机团 block 。

您需要为每个线程分配一个单独的 arg_struct,并确保每个线程在线程的生命周期内保持有效。

试试这个:

#define NUM_THREADS 10

int main() {
int i = 0;
pthread_t threads[NUM_THREADS];
arg_struct args[NUM_THREADS];
for (i = 0; i < NUM_THREADS; i++) {
args[i].id = i;
args[i].val = i + 10;
pthread_create(&threads[i], NULL, &printarg, &args[i]);
}
for (i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}

关于C 线程 (pthread_create) 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22445752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com