Segmentos e justiça POSIX (semáforos)

Eu criei um programa em C que cria 2 buffers. Os índices do buffer contêm caracteres únicos, 'A' ou 'b' etc ... Para aprender mais sobre multithreading, criei um conjunto de semáforos com base no problema produtor / consumidor para produzir caracteres e consumir caracteres dos buffers. Eu tenho 3 threads de produtor para cada buffer e 10 threads de consumidor. Os consumidores pegam um item de cada buffer e, em seguida, relatam (liberando a memória do item consumido também). Agora, pelo que li, sem_wait () deve sinalizar o "maior segmento de espera" quando sai de um estado de bloqueio (eu li isso em um livro e em uma biblioteca POSIX on-line).

Agora, isso é realmente verdade?

O aplicativo que eu fiz deve ter consumidores e produtores esperando no mesmo portão sem_wait (), mas os produtores entram na seção crítica mais do que o dobro do tempo de qualquer consumidor. Os consumidores têm um semáforo extra para esperar, mas isso não deve fazer a diferença. Não consigo entender por que isso está acontecendo, então espero que alguém o faça. Se eu dormir (1) nos threads do produtor, os consumidores entrarão muito bem e os buffers ficam em torno de 0 itens ... como eu pensaria que aconteceria de outra forma.

Além disso, a ordem de criação de encadeamentos deve desempenhar algum papel na estrutura do programa para a justiça?

IE, produza um de cada tipo de maneira round robin até que todos sejam criados e em execução.

Existe algum método que alguém possa me descrever para instituir um sistema mais justo de acesso a threads? Eu li que a criação de um sistema de fila FIFO pode ser uma solução, em que o maior segmento de espera tem a maior prioridade (que é o que eu pensei que sem_wait () faria de qualquer maneira).

Imaginando quais métodos existem para rosqueamento rudimentar e de nível superior.

questionAnswers(2)

yourAnswerToTheQuestion