将结构传递给线程

时间:2016-03-05 10:33:17

标签: c linux multithreading

对不起第二篇帖子,我发现线程真的很复杂.. 我试图将结构传递给线程参数,但我收到错误:

 error: dereferencing pointer to incomplete type
 printf("%d\n", assembly->size);

我不知道如何修复它,这是我的主要代码( test.c )。

#include "test.h"


int main()
{

    assembly.size = 10;

    pthread_t thread_tid;
    pthread_create(&thread_tid, NULL, foo, &assembly);

    pthread_join(thread_tid, NULL);

return 0;
}

线程调用的函数( test1.c ):

void * foo(void *param)
    {
        struct factory *assembly = param;
        printf("%d\n", assembly->size);
        return NULL;
    }

我的头文件包含结构定义( test.h ):

#ifndef TEST1_H
#define TEST1_H

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "test1.c"

struct factory{
    int size;
    int products_per_box;
    int products_to_assemble;
};
struct factory assembly;

void * foo(void *param);

#endif

2 个答案:

答案 0 :(得分:2)

原因是你是 #including 你的另一个.c文件,使它们成为1个编译单元(这是错误的)。 预处理后,test.c编译单元中的代码将类似于

/* contents of <stdio.h> */
/* contents of <stdlib.h> */
/* contents of <pthread.h> */

void * foo(void *param)
{
    struct factory *assembly = param;
    printf("%d\n", assembly->size);   // this line needs knowledge...
    return NULL;
}

struct factory{                    
    int size;
    int products_per_box;
    int products_to_assemble;
};                                    // ...that is available only after this 
                                      // line in this compilation unit



struct factory assembly;
void * foo(void *param);

int main()
{

    assembly.size = 10;

    pthread_t thread_tid;
    pthread_create(&thread_tid, NULL, foo, &assembly);

    pthread_join(thread_tid, NULL);

return 0;
}

注意到了吗? C编译器从上到下工作。在printf("%d\n", assembly->size);行,编译器不知道成员size的类型,也不知道struct factory是否有一个成员如此称呼。

您需要做的是test1.c #include "test.h"并分别编译test1.c

#include "test.h"  

void * foo(void *param)
{
    struct factory *assembly = param;
    printf("%d\n", assembly->size);
    return NULL;
}

此外,您希望将struct factory assembly 的声明从头文件中移出main.c,或者将每个具有该标头的编译单元移出包含的文件将声明该变量。

然后你可以使用一个命令编译和链接它们,例如:

% gcc test.c main.c -o program

或通过单独编译

% gcc -c test.c
% gcc -c main.c
% gcc -o program test.o main.o

答案 1 :(得分:-1)

1)从test.h删除此行 - 您不需要它

  struct factory assembly;

2)在main中添加assembly.size=10;

之前的行
   struct factory assembly;

3)添加一个角色,即改变

 struct factory *assembly = param;

struct factory *assembly = (struct factory *)param;

4)正如其他人所指出的那样 - 删除这一行

#include "test1.c"

通常,您只包含标题文件