Implementación de cola de bloqueo no ocupada en C

Estoy intentando implementar una cola en C que hace que un proceso no esté ocupado espere hasta que haya un elemento en la cola para consumir. He intentado dos cosas diferentes para tratar de lograr esto.

El primer problema que tengo es si las operaciones de puesta en cola / salida de cola tienenSi condicionales para comprobar los límites (Si(q-> count == QUEUESIZE)), la llamada a sem_wait se devolverá inmediatamente porque ningún otro proceso ha obtenido un bloqueo.

Si cambio el condicional amientras(q-> count == QUEUESIZE), creo que el proceso del consumidor "se ocupará de esperar" hasta que el proceso del productor publique el semáforo, que no es mi objetivo de la implementación. El proceso no adquirirá el bloqueo y continuará.

Creo que estoy cerca, pero parece que no puedo encontrar la forma de solucionar estos problemas. He pensado en agregar variables de condición o pthread_mutex, pero quería agotar las opciones de semáforo antes de agregar complejidad 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;
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta