我开始怀疑信号量的概念;请阅读以及理解我的问题......确保这个生产者 - 消费者示例不会死锁的条件?
根据手册,sem_post
将当信号量的值大于0
更大解锁线程...所以,如果我有这样的代码:
void* producer(void* arg)
{
while(1)
{
sem_wait(&sem_produce);
sem_wait(&mutex);
// Insert item into buffer
sem_post(&mutex);
sem_post(&sem_consume);
}
pthread_exit(NULL);
}
void* consumer(void* arg)
{
while(1)
{
sem_wait(&sem_consume);
sem_wait(&mutex);
// Remove item from buffer
sem_post(&mutex);
sem_post(&sem_produce);
}
pthread_exit(NULL);
}
在哪里sem_consume
用0
的值初始化,sem_produce
用N
初始化。
如果例如N
消费者在生产者之前运行并尝试消费会发生什么?那么sem_consume
应该有-N
的值,如果接下来有N
插入,sem_consume
和sem_produce
都应该是0
,或者我错了吗?那么这意味着消费者将被卡住,因为(根据手册)sem_post
将在信号量的值变得大于零时解锁线程...
因此,根据我从手册中了解并考虑上述示例,只有这种方式才能正常工作,如果sem_consume
永远不会达到-N
的价值。
我是对的?如果是的话,我该如何改进这个例子以免卡住?如果答案是否定的,我错了什么?
“那么sem_consume应具有-N的值”。那永远不会发生。它写在整个信号手册上。 [sem_overview manual](http://man7.org/linux/man-pages/man7/sem_overview.7.html)说:“一个信号量是一个整数,它的值**永远不会低于零**”。 [sem_wait](http://man7.org/linux/man-pages/man3/sem_wait.3.html):“如果信号量当前的值为零,则调用将阻塞,直到可以执行递减(即信号量值高于零)或信号处理程序中断呼叫。“ – kaylum
如果消费者在生产者之前运行,那么消费者都将等待'sem_consume',直到生产者设法执行'sem_post(&sem_consume)',对吗?只有一个消费者会为每个'sem_post(&sem_consume)'运行。在生产者被阻止等待消费者消费之前,会有'N'个项目排队。 –
奇怪的是,在我的并行编程课程中,我认为我从老师那里听说,信号量的值可能是负值,并且这个负值将表示阻塞线程的数量,如果此值不能为负,那么我没有疑惑。 – OiciTrap