在C中初始化SIMPLEQ_HEAD时出错

时间:2015-10-31 19:58:57

标签: c queue pthreads semaphore

我正在尝试在C和I中初始化SIMPLEQ_HEAD并收到以下错误:

# 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;
}

我的semaphore.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

1 个答案:

答案 0 :(得分:0)

经过一些测试,我意识到了

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

是一个静态操作,因此我无法动态创建信号量/ SIMPLEQ。

我将该行更改为

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

动态地处理初始化,并解决了我的问题。