如何在线程中共享内存

时间:2016-03-05 08:46:59

标签: c linux multithreading

我正在尝试使用我在线程函数内的main函数中分配的内存,但是我收到了错误:undefined reference to 'product_line'

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

int main()
{
    char** product_line;
    product_line = malloc(sizeof(char *));

    product_line[0] = "Toy";    
    product_line[1] = "Chair";
    product_line[2] = "Door";

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

    pthread_join(thread_tid, NULL);

return 0;
}

这是线程调用的独立源:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

extern char** product_line;

void * foo(void *param)
{
    int i;
    printf("%s\n", product_line[0]);
    for (i = 0; i < 3; i++)
        printf("%s\n", product_line[i]);
}

如何解决此错误?

3 个答案:

答案 0 :(得分:4)

变量product_line应在main之外声明,否则无法从其他翻译单元访问:

/* main.c */
…

char **product_line;

int main()
{
    …
}

MikeCAT提到的另一个问题:

  

包括.c源文件是不寻常的。

考虑添加标头文件test1.h

/* test1.h */
#ifndef TEST1_H
#define TEST1_H

void * foo(void *param);

#endif

然后,将#include "test1.c"中的main.c替换为:

#include "test1.h"

当编译foomain.c时,需要避免重复定义test1.c。 (假设您使用类似于cc main.c test1.c的内容编译代码。)建议(尽管是可选的)在test1.h中也包含test1.c

Martin James也提到:

  

您为一个指针分配空间,然后使用其中三个:((

这一行

product_line = malloc(sizeof(char *));

为单个char *指针分配空间。但是,您实际上正在使用其中的3个,因此您需要分配3个char *指针:

product_line = malloc(sizeof(char *) * 3);

答案 1 :(得分:3)

product_line的定义无法访问,因为它是局部变量,而不是全局变量。

使product_line全球化是一种简单的解决方法。

另一种解决方案是将product_line作为参数传递。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void * foo(void *param)
{
    char** product_line = param;
    int i;
    printf("%s\n", product_line[0]);
    for (i = 0; i < 3; i++)
        printf("%s\n", product_line[i]);
    return NULL;
}

int main(void)
{
    const char** product_line; /* strings literals are not modifyable */
    product_line = malloc(sizeof(const char *) * 3); /* Do allocate enough buffer! */
    if (product_line == NULL) /* You should check if malloc() was successful. */
    {
        perror("malloc");
        return 1;
    }
    product_line[0] = "Toy";
    product_line[1] = "Chair";
    product_line[2] = "Door";

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

    pthread_join(thread_tid, NULL);

    free(product_line); /* You should free() what you allocatted via malloc(). */
    return 0;
}

答案 2 :(得分:1)

您应该知道本地(自动)变量和全局变量之间的区别。

以下链接中的变量范围: http://www.tutorialspoint.com/cprogramming/c_scope_rules.htm

如果您阅读上一个教程,您将能够自己检测错误。 product_line变量为auto,这意味着一旦您输入&#34; main&#34;它就会在堆栈区域中创建。通过摆脱它来实现并摧毁它。

因此,此变量不适用于foo函数;不在它的堆栈上。 建议的解决方案:

  • 制作一个可用于所有功能的全局指针

  • foo函数添加新参数并将此指针传递给它。

注意:

包含.c文件,包含.h而不是常见的,它包含原型和此模块的已定义类型。