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