2015-10-31 2 views
1

Я пытаюсь инициализировать SIMPLEQ_HEAD в C, и я и получаю следующее сообщение об ошибке:Ошибка инициализации SIMPLEQ_HEAD в C

# gcc -o semaphore semaphore.c 
semaphore.c: In function `createSemaphore': 
semaphore.c:10: syntax error before `{' 

Мой semaphore.c класс выглядит:

#include <stdio.h> 
#include "semaphore.h" 

semaphore_t* createSemaphore(int initialCount) 
{ 
    semaphore_t* sem; 
    sem = (semaphore_t *) malloc(sizeof(semaphore_t)); 
    sem->head = SIMPLEQ_HEAD_INITIALIZER(sem->head); 
    sem->count = initialCount;  // set the semaphores initial count 
    return sem; 
} 
... 
int main() 
{ 

    semaphore_t* my_semaphore = createSemaphore(5);  
    return 0; 
} 

И мой семафора .h выглядит следующим образом:

#ifndef SEMAPHORE_H 
#define SEMAPHORE_H 

#include <sys/queue.h> 
#include <pthread.h> 
#include <stdlib.h> 

struct entry_thread { 
    int threadid; 
    SIMPLEQ_ENTRY(entry_thread) next; 
} *np; 

struct semaphore { 
    int count; 
    pthread_mutex_t mutex; 
    pthread_cond_t flag; 
    SIMPLEQ_HEAD(queuehead, entry_thread) head; 
}; 

typedef struct semaphore semaphore_t; 

semaphore_t* createSemaphore(int initialCount); 
void destroySemaphore(semaphore_t* sem); 
void down(semaphore_t* sem); 
void up(semaphore_t* sem); 

#endif 

Я новичок в C и использовать SIMPLEQ, так что если кто-нибудь имеет опыт в этом я бы очень ар предоставьте некоторую помощь.

Для справки, страница людей SIMPLEQ_HEAD является: http://www.manualpages.de/OpenBSD/OpenBSD-5.0/man3/SIMPLEQ_HEAD.3.html

+0

Я не читал все это, но то, что прыгает прямо в лицо: почему heck реализует * семафор * поверх * mutexes * и * condition variables *? Семафор * * намного проще, чем * mutex * и уже доступен в POSIX. ('sem_t', см. [' sem_init (3) '] (http://linux.die.net/man/3/sem_init)) –

+0

Несвязанный, но: http://stackoverflow.com/questions/605845/do -i-cast-the-result-of-malloc – szczurcio

+0

@FelixPalmen это для моего курса операционной системы, поэтому мы учимся реализовывать его самостоятельно. – Zach

ответ

0

После некоторого тестирования, я понял,

sem->head = SIMPLEQ_HEAD_INITIALIZER(sem->head); 

является статической операции, поэтому он не будет работать, как я динамически создавать семафоры/SIMPLEQs.

Что я изменил эту строку вместо этого

SIMPLEQ_INIT(&(sem->head)); // note that you don't set anything equal to the result 

, который динамически заботится о инициализации, и решить мою проблему.

Смежные вопросы