C - 将结构传递给线程

时间:2016-11-30 08:15:04

标签: c multithreading struct pthreads

我有一个struct

struct dotData{
    long x;
    long y;
};

我尝试传递给多个threads

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()的{​​{1}}开始,每次更改其元素thisdotfind_z时,它都会作为参数传递给x < / p>

y

但是,在编译期间,我在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;

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

2 个答案:

答案 0 :(得分:2)

问题是data->x是结构的指针,对于那些需要使用“箭头”运算符data的人,就像->一样}。

但是有一个更糟糕的问题:

data->x

指针struct dotData *data; *data = *((struct dotData*)(thisdot)); 没有指向任何地方。未初始化的本地(非静态)变量将具有不确定值。要使用指针,您实际需要将其指向某处。

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

data

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

这可以通过动态分配传递给线程的结构来解决。然后,您可以只复制指针而不是复制结构。你必须记住struct dotData = *(struct dotData *) thisdot; 数据,否则你会有内存泄漏。

答案 1 :(得分:0)

import pure from 'recompose/pure'; const PureListGroup = pure(ListGroup); 是指针,因此请使用data(*data).x