【问题标题】:Access Struct members after pass to pthread function call传递给 pthread 函数调用后访问结构成员
【发布时间】:2020-02-16 13:13:52
【问题描述】:

我正在尝试访问传递给由 pthread 进程调用的函数的结构的成员。这很简单,但由于某种原因我无法弄清楚。

我尝试过使用 data.count 或 data->count,但我想我需要将我的数据指针转换为传递给它的结构?我很困惑,但我相信解决方案很简单。请帮忙。 这是结构,后面是 pthread 调用和正在使用的函数。谢谢。 我可以补充一点,BUFFER_SIZE 是全局定义的,所以从我的理解来看这不是问题。我没有在代码中分享。

typedef struct {
        int buffer[BUFFER_SIZE];
        int count;
        int top;
        int next;
        pthread_mutex_t count_lock;
} prodcons;

//this is in main.c
prodcons pc_nums;

//create producer thread
pthread_create(&tid, &attr, *producer, &pc_nums);

//This is the runner function, pthread call this
void *producer(void *data)
{
        //set up data structure to be shared between producer and       consumer
        int number;
        prodcons primeNums;
        pc_init(&primeNums);

        //call consumer thread
        pthread_t tid;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_create(&tid, &attr, *consumer, &primeNums);

        while (data->count < BUFFER_SIZE)
        {
                number = pc_pop(data);
                factor2pc(&primeNums, number);
        }
}

我只是希望访问我的 pthread_create 传递的结构中的变量,但我得到了 错误:“计数”不是某些结构或联合的一部分。 我真的需要弄清楚如何让数据指向我的结构,以便我可以访问它的成员

【问题讨论】:

    标签: c struct casting pthreads


    【解决方案1】:

    短版:是的,您必须将“数据”转换为正确的类型:

    void producer(void *data_p) {
        prodcons *data = data_p ;
        ... rest of your code ...
    } ;
    

    旁注:小心“pc_nums”的存储类。在多线程程序中,main 可以自行终止(pthread_exit),或者自动释放变量。从您的示例中不清楚 prodcons 是如何分配的。如果 prodcons 是 'auto' 变量(本地),请考虑将其设为静态,或根据需要使用 malloc/calloc 为其分配堆空间。

    【讨论】:

    • 这似乎解决了问题,但假设我想访问该结构的缓冲区?假设 int val = data->buffer[0] 给我缓冲区的第一个元素?
    • Struct 在文件中被声明为 main 上方的全局结构,这是一个问题吗?
    • 我相信第一个问题是肯定的(data->buffer[0])。
    • 使用全局不是问题,前提是您没有多个并发线程试图在没有同步的情况下修改(全局)结构
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2021-03-03
    • 2017-03-19
    • 2021-11-17
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多