gpt4 book ai didi

c - 具有唯一结构作为参数 C 的 pthread

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

我有一段代码给我带来了麻烦。我知道所有线程都在读取相同的结构。但我不知道如何解决这个问题。

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

typedef struct {
int a,b;
} s_param;

void *
threadfunc(void *parm)
{
s_param *param2 = parm;
printf("ID:%d and v:%d\n",param2->a,param2->b);
pthread_exit(NULL);
}

int main(int argc, char **argv)
{
pthread_t thread[3];
int rc=0,i;
void * status;

for(i=0; i<3 ; ++i){
s_param param;
param.b=10;
param.a=i;
rc = pthread_create(&thread[i], NULL, threadfunc, &param ); // !!!!
if(rc){
exit(1);
}
}

for(i=0; i<3 ; ++i){
pthread_join(thread[i],&status);
}
return 0;
}

输出:

ID:2 and v:10
ID:2 and v:10
ID:2 and v:10

以及我需要的:

ID:0 and v:10
ID:1 and v:10
ID:2 and v:10

最佳答案

for 循环中的 sparam 范围在该循环内是静态的。当您设置 .a 和 .b 时,您正在一遍又一遍地写入相同的结构,并且所有三个线程都获得指向同一个结构的指针。

相反,您可以像这样创建一个数组来创建该结构的三个独立实例。

int main(int argc, char **argv)
{
pthread_t thread[3];
s_param param[3];
int rc=0,i;
void * status;

for(i=0; i<3 ; ++i){
param[i].b=10;
param[i].a=i;
rc = pthread_create(&thread[i], NULL, threadfunc, &param[i] ); // !!!!
if(rc){
exit(1);
}
}
... etc

应该提到,在这样的数组中创建结构(和线程)是唯一可行的,因为您显然对主线程执行了 join()。如果您没有执行该连接,建议您在主函数之外静态分配结构,或者从堆中分配它们,因为一旦入口线程退出主函数,包含数组的堆栈帧将变得无效,并很快以不可预知的方式被覆盖。

关于c - 具有唯一结构作为参数 C 的 pthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2576558/

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