gpt4 book ai didi

C - 将结构传递给线程时出错

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

这里我有一个struct

struct dotData{
long x;
long y;
};

我尝试将其传递给多个线程

void *find_z(void *thisdot)
{
long z;
struct dotData *data;
*data = *((struct dotData*)(thisdot));
z = data.x + data.y;
printf("Here's our dot! %ld * %ld = %ld \n", data.x, data.y, z);
pthread_exit(NULL);
}

main() 中,我创建了一个结构体 thisdot,每次它的元素 都作为参数传递给 find_z xy 已更改

int main()
{
.
.
.
struct dotData thisdot;

int NUM_THREADS;
NUM_THREADS = N*M;
pthread_t threads[NUM_THREADS];
int i, j;

for(i = 0; i < M; i++){
for (j = 0; j < N; j++) {
thisdot.x = x_dotBegin + x_interval*j;
thisdot.y = y_dotBegin + y_interval*i;
pthread_create(&threads[NUM_THREADS], NULL, find_z, &thisdot);
}
}
pthread_exit(NULL);
}

但是,在编译过程中,我在 z = data.x + data.y;

中遇到错误
error: request for member ‘x’ in something not a structure or union|
error: request for member ‘y’ in something not a structure or union|

如何正确地将此结构传递给线程?

最佳答案

问题是 data 是一个指向结构的指针,对于那些你需要使用“箭头”操作符 -> ,就像在 data->x 中一样。


还有一个更糟糕的问题:

struct dotData *data;
*data = *((struct dotData*)(thisdot));

指针 data 没有指向任何地方。未初始化的局部(非静态)变量将具有不确定 值。要使用指针,您实际上需要让它指向某处。

或者,对于一个简单的解决方案和我推荐的解决方案,根本不使用指针:

struct dotData = *(struct dotData *) thisdot;

您还有一个大问题,就是如何将数据传递给线程。所有线程都将获得指向相同结构的相同指针。因此,您在线程创建循环中所做的修改将为所有线程中的数据设置。

这可以通过动态分配传递给线程的结构来解决。然后您可以只复制指针而不是复制结构。并且您必须记住 free 数据,否则会发生内存泄漏。

关于C - 将结构传递给线程时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40883313/

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