我有一个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}}开始,每次更改其元素thisdot
和find_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;
如何正确地将此结构传递给线程?
答案 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