您好,我正在处理有关使用多信号量的 POSIX 线程的任务。分配的简要说明是:有 4 个不同的数据包(char/video/audio/image),每个数据包由不同的线程承载,并且我们有一个共享缓冲区。系统上可以工作的最大线程数将由用户维护作为输入。例如; 如果用户输入 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
使用此实施程序可以正常工作。但我无法正确使用属于包线程的信号量。我可以听取每一个建议,每一个回答都会受到赞赏。