当前位置: 技术问答>linux和unix
关于信号量的位置问题
来源: 互联网 发布时间:2016-06-28
本文导语: 题目: 生产者: void producer(void) { int item; while (TRUE) { /* TRUE is the constant 1 */ item = produce_item(); /* generate something to put in buffer */ down(&empty);...
题目:
生产者:
void producer(void)
{
int item;
while (TRUE) { /* TRUE is the constant 1 */
item = produce_item(); /* generate something to put in buffer */
down(&empty); /* decrement empty count */
down(&mutex); /* enter critical region */
insert_item(item); /* put new item in buffer */
(1) up(&mutex); /* leave critical region */
(2) up(&full); /* increment count of full slots */
}
}
消费者:
void consumer(void)
{
int item;
while (TRUE) { /* infinite loop */
down(&full); /* decrement full count */
down(&mutex); /* enter critical region */
item a= remove_item(); /* take item from buffer */
up(&mutex); /* leave critical region */
up(&empty); /* increment count of empty slots */
consume_item(item); /* do something with the item */
}
}
将生产者中的(1)和(2)互换行不行,为什么?
我个人认为可以哟。还没有答案。
生产者:
void producer(void)
{
int item;
while (TRUE) { /* TRUE is the constant 1 */
item = produce_item(); /* generate something to put in buffer */
down(&empty); /* decrement empty count */
down(&mutex); /* enter critical region */
insert_item(item); /* put new item in buffer */
(1) up(&mutex); /* leave critical region */
(2) up(&full); /* increment count of full slots */
}
}
消费者:
void consumer(void)
{
int item;
while (TRUE) { /* infinite loop */
down(&full); /* decrement full count */
down(&mutex); /* enter critical region */
item a= remove_item(); /* take item from buffer */
up(&mutex); /* leave critical region */
up(&empty); /* increment count of empty slots */
consume_item(item); /* do something with the item */
}
}
将生产者中的(1)和(2)互换行不行,为什么?
我个人认为可以哟。还没有答案。
|
我认为有区别,不过不是很大:
首先,占用临界区的时间要尽可能短,提高响应
其次,这个例子中full和empty作为计数器,在使用顺序上应该有所区别,
生产者先要操作&empty,离开临界区后操作&full,消费者与之相反,我觉得(2)放在(1)前会比较好,避免离开临界区时,计数器没有改变,被另一个进程使用时,会造成判断不正确。
首先,占用临界区的时间要尽可能短,提高响应
其次,这个例子中full和empty作为计数器,在使用顺序上应该有所区别,
生产者先要操作&empty,离开临界区后操作&full,消费者与之相反,我觉得(2)放在(1)前会比较好,避免离开临界区时,计数器没有改变,被另一个进程使用时,会造成判断不正确。