Использование pthread в Linux 2.4 - ошибка компиляции «неполного типа» - PullRequest
2 голосов
/ 16 мая 2011

Я работаю над Linux 2.4 (делаю hw для моего курса по ОС), я хочу использовать 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 голосов
/ 16 мая 2011

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

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
1 голос
/ 16 мая 2011

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

  1. Вы должны просто переместить свой struct reader_writers_t из rw_lock.c в свой файл rw_lock.h.

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

...