【发布时间】:2012-10-29 02:10:25
【问题描述】:
您好,我正在处理一项关于使用多信号量的 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
使用此实现程序可以正常工作。但我无法正确使用属于包线程的信号量。我可以倾听每一个建议,每一个回答都将不胜感激。
【问题讨论】:
-
在您的代码中,消费者实际上并不知道它正在从缓冲区读取什么类型的数据。这样好吗?
-
我认为您的意思是表示您想使用一个信号量来分配整体并发线程数,并使用N个信号量,每个数据包一个type 为任何单个数据包类型分配并发线程数。这甚至接近准确吗?有点困惑..
-
@didierc 是的,我安排了参数没有问题,所以它可以正常工作。首先,我将结构作为参数发送给生产者,消费者在互斥体中进行出队操作。并且 Queue 是全局定义的。
标签: c synchronization pthreads semaphore