Привет, я работаю над заданием об использовании потоков POSIX с несколькими семафорами. краткое объяснение назначения: есть 4 различных пакета данных (символ/видео/аудио/изображение), каждый из которых передается отдельным потоком, а также у нас есть общий буфер. максимальное количество потоков, которые могут работать в системе, будет поддерживаться пользователем в качестве входных данных. Например; если пользователь вводит 10, то может быть создано максимум 10 потоков для передачи пакетов данных через буфер в заданное время. теперь меня смущает то, что этот буфер может мгновенно содержать ограниченное количество пакетов. (например, он может содержать максимум 10 пакетов символов и 20 видеопакетов и т. д.), поэтому у нас должны быть разные семафоры для каждого типа данных. проблема, которую я знаю, как контролировать размер буфера с помощью семафора, который очень прост, но не могу установить правильную идею использования семафоров пакетов». даже я пробовал несколько разных методов, я всегда сталкивался с ошибками взаимоблокировки. вот мой псевдокод, чтобы лучше понять мою программу.
define struct packege
define semaphore list
main
initialize variables and semaphores
while threadCounter is less than MaxThreadNumber
switch(random)
case 0: create a character package
create a thread to insert the package in buffer
case 1: create a video package
create a thread to insert the package in buffer
case 2: create an image package
create a thread to insert the package in buffer
case 3: create an audio package
create a thread to insert the package in buffer
increment threadCounter by one
end of while
create only one thread which will make the dequeue operation
end of main
producer function
for i->0 to size_of_package
sem_wait(empty_buffer) // decrement empty_buffer semaphore by size of package
lock_mutex
insert item into queueu
decrement counter of the buffer by size of package
unlock_mutex
for i->0 to size_of_package
sem_post(full_buffer) // increment full_buffer semaphore by size of package
end of producer function
consumer function
while TRUE // Loops forever
lock_mutex
if queue is not empty
dequeue
increment counter of the buffer size of package
unlock_mutex
for i->0 to size_of_package // The reason why i making the sem_wait operation here is i cant make the dequeue in outer region of mutex.
sem_wait(full_buffer)
for i->0 to size_of_package
sem_post(empty_buffer)
end of consumer function
с этой реализацией программа работает корректно. но я не мог правильно использовать семафоры, принадлежащие потокам пакетов. Я могу выслушать каждую рекомендацию и буду признателен за каждый ответ.