【问题标题】:C - Error while passing structure to threadsC - 将结构传递给线程时出错
【发布时间】:2017-04-14 11:28:24
【问题描述】:

我有一个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() 创建一个结构thisdot,每次更改其元素xy 时,它都会作为参数传递给find_z

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-&gt;xdata-&gt;y 但您对 *data = ... 有未定义的行为
  • 编译器会准确地告诉您问题所在。数据不是结构,也不是联合。数据是一个指针。像指针一样处理它。

标签: c multithreading struct pthreads


【解决方案1】:

data是一个指针,所以使用(*data).xdata-&gt;x

【讨论】:

    【解决方案2】:

    问题在于data 是一个指向结构的指针,对于那些你需要使用“箭头”运算符-&gt; 的人,就像在data-&gt;x 中一样。


    还有一个更严重的问题:

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

    指针data 没有指向任何地方。未初始化的本地(非静态)变量将具有 indeterminate 值。要使用指针,您实际上需要将其指向某个地方。

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

    struct dotData = *(struct dotData *) thisdot;
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 2015-07-18
      • 2012-10-15
      • 2020-03-31
      • 2021-06-30
      相关资源
      最近更新 更多