Использование pthread в Linux 2.4-получение ошибки компиляции" неполный тип"


Я работаю над Linux 2.4 (делаю h. w для моего O'S курса), Я хочу использовать pthread для реализации блокировки чтения-записи. В rw_lock.c у меня есть:

#include <pthread.h>
#include <stdlib.h>
#include "rw_lock.h"

struct readers_writers_t
{
    int prio;
    int number_of_readers;
    pthread_cond_t no_readers;
    int number_of_writers;
    int number_of_waiting_writers;
    pthread_cond_t no_writers;
    pthread_mutex_t lock;
};

[functions...]

В rw_lock.h у меня есть:

typedef struct readers_writers_t readers_writers;

В другом файле C (реализация связанного списка) у меня есть:

#include "rw_lock.h"

struct LinkedList
{
    ListNode* head;
    ListNode* tail;
    readers_writers rwLock;
};

(and more functions,includes etc').

Я получаю (одну) ошибку компиляции:

"rwLock имеет неполный тип".

Я понятия не имею, почему я получаю эту ошибку (или как ее исправить...).

Помощь ценится, спасибо!

2 2

2 ответа:

Ваш файл связанного списка C не знает о struct readers_writers_t, он определен в вашем rw_lock.C файл.

  1. Вы должны просто переместить свою структуру readers_writers_t из rw_lock.c и в ваш rw_lock.H файл.

  2. Или, возможно, вы не хотите, чтобы ваш связанный список знал об этой структуре. В этом случае вы должны определить readers_writers rwLock скорее как указатель (readers_writers *rwLock). Другой альтернативой является: сделайте свой readers_writers typedef указателем: typedef struct readers_writers_t *readers_writers Для этого необходимо, чтобы функции в rw_lock.c выделяет место для фактической структуры, поскольку это единственный файл, который знает о фактической структуре.

Вам нужно переместить определение структуры из исходного файла в файл заголовка.

Rw_lock.h должно быть:

#ifndef  SOME_UNIQUE_STRING_MY_RW_LOCK_H
#define  SOME_UNIQUE_STRING_MY_RW_LOCK_H

#include <pthread.h>

struct readers_writers_t
{
    int prio;
    int number_of_readers;
    pthread_cond_t no_readers;
    int number_of_writers;
    int number_of_waiting_writers;
    pthread_cond_t no_writers;
    pthread_mutex_t lock;
};
typedef struct readers_writers_t readers_writers;

#endif