gpt4 book ai didi

c - Pthread 未打印正确的值

转载 作者:行者123 更新时间:2023-11-30 15:00:12 24 4
gpt4 key购买 nike

这是我编写的一个简单程序。它在 for 循环中创建 10 个线程,每个线程打印 i 的值:

#include <stdio.h>
#include <pthread.h>
void* basic_function(void *num){
int cur_num = *(int*)num;
printf("Current thread number is :%d\n", cur_num);
return NULL;
}

int main(int argc, const char * argv[]) {
pthread_t thread_id [10];
void * exit_status[10];

for (int i = 0; i < 10; i++){
pthread_create(&thread_id[i], NULL, basic_function, &i);
printf("i is: %d\n", i);
}


for (int i = 0; i<10; i++){
pthread_join(thread_id[i], &exit_status[i]);


return 0;
}

我认为输出应该类似于从 0 到 9 的一些打印语句,并且顺序正确:

Current thread number is: 0
i is: 0
Current thread number is: 1
i is: 1
Current thread number is: 2
i is: 2
...

但是,我的输出是:

i is: 0
i is: 1
i is: 2
i is: 3
i is: 4
i is: 5
Current thread number is: 6
Current thread number is: 6
i is: 6
Current thread number is: 6
Current thread number is: 6
Current thread number is: 6
Current thread number is: 6
Current thread number is: 6
i is: 7
Current thread number is: 7
i is: 8
Current thread number is: 9
Current thread number is: 9
i is: 9

为什么线程6被创建多次?为什么有些线程没有创建?另外,为什么我运行程序时总是得到不同的输出?

最佳答案

因为传递给线程函数的参数指向同一个变量 - i

由于变量imain函数不断更新,线程总是在运行时获取最新值,并且线程并行执行此操作使用 main 方法。此外,一旦循环完成,线程可能会访问该变量,在这种情况下,这是未定义的行为。

解决方案是在堆上分配 i 的副本并将指针传递给该副本。或者另一个有点脏的解决方案是将 i 转换为指针,作为参数传递,然后在线程中转换回 int。这依赖于 int 小于指针,这很常见,但在一些晦涩的架构上可能不是真的(对于这么小的数字可能不是这种情况)。

关于c - Pthread 未打印正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42264709/

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