POSIX темы и справедливость (семафоры)

Я создал программу на C, которая создает 2 буфера. Индексы буфера содержат одиночные символы, «A» или «b» и т. Д. Чтобы узнать больше о многопоточности, я создал набор семафоров, основанных на проблеме производителя / потребителя, для получения символов и потребления символов из буферов. У меня есть 3 потока производителей для каждого буфера и 10 потоков потребителей. Потребители берут по одному элементу из каждого буфера, а затем сообщают об этом (освобождая также память о потребленном элементе). Теперь, из того, что я прочитал, sem_wait () должен сигнализировать «самый длинный ожидающий поток», когда он выходит из состояния блокировки (я читал это в книге и в онлайн-библиотеке POSIX).

Теперь, это на самом деле правда?

Приложение, которое я сделал, должно иметь и потребителей, и производителей, ожидающих одного и того же шлюза sem_wait (), но производители попадают в критическую секцию более чем в два раза быстрее, чем любой потребитель. У потребителей есть дополнительный семафор для ожидания, но это не должно иметь такого большого значения. Я не могу понять, почему это происходит, поэтому я надеюсь, что кто-то еще делает. Если я сплю (1) в потоках производителя, потребители попадают в систему нормально, а буферы колеблются около 0 пунктов ... как я думаю, что произойдет иначе.

Кроме того, должен ли порядок создания потоков играть какую-то роль в том, как я структурирую программу для справедливости?

IE, производите один из каждого типа в циклическом режиме, пока все не будут созданы и запущены.

Есть ли какие-либо методы, которые кто-нибудь может мне описать, чтобы установить более справедливую систему доступа к потокам? Я читал, что создание системы очередей FIFO может быть одним из решений, где самый длинный ожидающий поток имеет наивысший приоритет (как я и думал, sem_wait () будет делать в любом случае).

Просто интересно, какие существуют методы как для элементарной, так и для высокоуровневой потоков.

Ответы на вопрос(2)

Ваш ответ на вопрос