Доступ к членам Struct после перехода к вызову функции pthread - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь получить доступ к членам моей структуры, которая передается функции, которая была вызвана процессом 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, но я получаю ошибку: 'count' не является частью какой-либо структуры или объединения. Мне действительно нужно просто выяснить, как заставить данные указывать на мою структуру, чтобы я мог получить доступ к ее элементам

1 Ответ

0 голосов
/ 20 октября 2019

Короткая версия: Да, вы должны привести «данные» к нужному типу:

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

Примечание: будьте осторожны с классом хранения 'pc_nums'. В многопоточной программе основной может завершаться сам (pthread_exit) или автоматически освобождаться переменные. Из вашего примера не ясно, как распределяется prodcons. Если prodcons - это переменная 'auto' (локальная), рассмотрите возможность сделать ее статической или используйте malloc / calloc, чтобы выделить место для кучи, если это необходимо.

...