Bloqueio não ocupado Implantação de fila em C

Eu estou tentando implementar uma fila em C que faz com que um processo para não-ocupado esperar até que haja um elemento na fila para consumir. Eu tentei duas coisas diferentes para tentar conseguir isso.

O primeiro problema que tenho é se as operações de enfileiramento / desenfileiramentoE se condicionais para verificar os limites (E se(q-> count == QUEUESIZE)), a chamada para sem_wait retornará imediatamente porque nenhum outro processo obteve um bloqueio.

Se eu mudar o condicional paraenquanto(q-> count == QUEUESIZE), acredito que o processo do consumidor ficará 'ocupado esperando' até que o semáforo seja postado pelo processo do produtor, o que não é meu objetivo de implementação, e através de testes, descobri que o consumidor processo não irá adquirir o bloqueio e continuar.

Eu acho que estou perto, mas não consigo descobrir como contornar esses problemas. Eu pensei em adicionar variáveis ​​de condição ou pthread_mutex, mas queria esgotar as opções de semáforo antes de adicionar complexidade adicional.

#define QUEUESIZE 48

typedef struct 
{           
    char q[QUEUESIZE+1][150];
    int first;                      
    int last;                       
    int count;                      
    sem_t *lock;                    
} Queue;


init_queue(Queue *q, sem_t *l)
{
    q->first = 0;
    q->last = QUEUESIZE-1;
    q->count = 0;
    q->lock = l;
}

enqueue(Queue *q, char x[150])
{
    while(q->count == QUEUESIZE)
        sem_wait(q->lock);

    if (q->count == 0)
    {
        if (sem_post(q->lock) == -1)
        {
            printf("Thread failed to unlock semaphore\n");
        }
    }       
    q->last = (q->last+1) % QUEUESIZE;
    strcpy(q->q[ q->last ],x);    
    q->count = q->count + 1;
}

dequeue(Queue *q,char *ptr)
{
    char x[150];
    while(q->count == 0)
        sem_wait(q->lock);

    if (q->count == QUEUESIZE) 
    {
        if (sem_post(q->lock) == -1)
        {
            printf("Thread failed to unlock semaphore\n");
        }
    }   
    strcpy(ptr,q->q[ q->first]);
    q->first = (q->first+1) % QUEUESIZE;
    q->count = q->count - 1;
}

questionAnswers(1)

yourAnswerToTheQuestion