首页 > 试题广场 >

以下的生产者消费者程序中,那个不会出现锁死,并且开销最少

[单选题]
以下的生产者消费者程序中,那个不会出现锁死,并且开销最少?
注:
down()
1 判断信号量的取值是否大于等于1
2 如果是,将信号量的值减去一,继续向下执行
3 否则,在该信号量上等待(进城被挂起)
up()
1 将信号量的值增加1(此操作将叫醒一个在信号量上面等待的进程)
2 线程继续往下执行
down()和up()是一组原子操作
  • #define N 100 //定义缓冲区的大小
    typedef int semaphore; //定义信号量类型
    semaphore mutex = 1; //互斥信号量
    semaphore empty = N; //缓冲区计数信号量
    semaphore full = 0; //缓冲区计数信号量,用来计数缓冲区里的商品数量
    void producer(void)
    {
        int item;
        while(TRUE){
            item = produce_item();
            down(&empty);
            down(&empty);
            insert_item(item);
            up(&mutex);
            up(&full);
        }
    }
    void consumer(void)
    {
        int item;
        while(TRUE){
            down(&full);
            down(&mutex);
            item = remove_item();
            up(&mutex);
            up(&empty);
            consume_item(item);
        }
    }
    
  • #define N 100
    typedef int semaphore;
    semaphore empty = N;
    semaphore full = 0;
    void producer(void)
    {
        int item;
        while(TRUE){
            item = produce_item();
            down(&empty);
            insert_item(item);
            up(&full);
        }
    }
    void consumer(void)
    {
        int item;
        while(TRUE){
            down(&full);
            item = remove_item();
            up(&empty);
            consume_item(item);
        }
    }
    
  • #define N 100
    typedef int semaphore;
    semaphore mutex = 1;
    semaphore empty = N;
    semaphore full = 0;
    void producer(void)
    {
        int item;
        while(TRUE){
            item = produce_item();
            down(&empty);
            down(&empty);
            insert_item(item);
            up(&mutex);
            up(&full);
        }
    }
    void consumer(void)
    {
        int item;
        while(TRUE){
            down(&mutex);
            down(&full);
            item = remove_item();
            up(&mutex);
            up(&empty);
            consume_item(item);
        }
    }
    
  • #define N 100
    typedef int semaphore;
    semaphore mutex = 1;
    semaphore empty = N;
    semaphore full = 0;
    void producer(void)
    {
        int item;
        while(TRUE){
            item = produce_item();
            down(&empty);
            down(&mutex);
            insert_item(item);
            up(&full);
            up(&mutex);
        }
    }
    void consumer(void)
    {
        int item;
        while(TRUE){
            down(&full);
            down(&mutex);
            item = remove_item();
            up(&empty);
            up(&mutex);
            consume_item(item);
        }
    }
    
首先互斥变量是相互对称的,第二没有互斥量会造成死锁。根据这两个条件就可以排除ABC。一个产品只能被一个消费者或一个生产者使用,必须要用互斥量,否则会进入两个角色会进入请求等待状态。
发表于 2015-09-05 17:11:52 回复(0)
感觉题目出的不够好,D选项下面这两处应该分别交换一下位置,这样才能保证资源利用最大化,
也就是应该:在保证功能正确的情况下,先释放共享锁:
void producer(void)
{
    int item;
    while(TRUE){
        item = produce_item();
        down(&empty);
        down(&mutex);
        insert_item(item);
        up(&full);-------应该改为:UP(&mutex)
        up(&mutex);------应该改为:up(&full)
    }
}
void consumer(void)
{
    int item;
    while(TRUE){
        down(&full);
        down(&mutex);
        item = remove_item();
        up(&empty);------应该改为:up(&mutex)
        up(&mutex);------应该改为:up(&empty)
        consume_item(item);
    }
}
编辑于 2017-11-14 15:23:54 回复(0)
如果默许印刷错误,AC被排除,B选项即使是单生产者和单消费者,也因没有互斥保护,造成资源链表被生产者和消费者同时访问(full>1),只能选D。如果将印刷错误纠正,答案应在ACD中选择临界区最小的,才是最高效的,那就是A
发表于 2017-02-11 10:30:49 回复(0)
。。。自己写代码知道加锁。结果我看前两个都没锁,还以为记错了。直接b了
发表于 2021-08-24 19:22:22 回复(0)
<p>要有互斥变量,并且互斥变量要对称</p><p><br></p>
发表于 2020-09-02 10:15:44 回复(0)
前三个选项都没有在生产者和消费者的进程里设置互斥条件,这有可能会导致死锁或者是越界。
发表于 2016-07-19 09:20:52 回复(0)
这题为何这么长
发表于 2015-10-22 09:30:12 回复(4)
单生产者单消费者是B,多生产者多消费者是D
发表于 2015-09-02 17:02:38 回复(1)
这么长都不想看,我是乱选的
发表于 2016-08-23 16:32:27 回复(0)
B没有互斥条件
发表于 2021-12-23 16:38:00 回复(0)
这题为何这么突出,👿
发表于 2018-08-26 12:44:49 回复(0)
m
发表于 2017-08-12 21:57:49 回复(0)
D 项中 难道顺序就对了吗?
        down(&empty);
        down(&mutex);
        insert_item(item);
        up(&full);   //后两个不应该互换位置吗?
        up(&mutex);//
编辑于 2016-08-17 16:36:48 回复(1)
互斥变量是相互对称的,第二没有互斥量会造成死锁
发表于 2016-07-07 20:04:50 回复(0)
共享区域 存放物品的存储区 所以必有共享变量 对共享区域的操作必使用互斥变量 对互斥变量的操作必是成对的 down占据共享区域之后up释放共享区域
发表于 2016-05-11 11:00:19 回复(0)
在客户端看到的题中是这样的down(∅),醉了…
发表于 2015-10-29 01:33:53 回复(0)
难道不是应该
先P(mutex)
在P(full or empty)吗,先互斥后同步啊,为什么答案和解析都一边倒?
发表于 2015-09-09 20:12:05 回复(1)
d
发表于 2015-03-27 13:32:34 回复(1)
D
发表于 2015-03-25 22:27:02 回复(0)
答案A中为什么会有两个down(empty);第二个应该是down(mutex)才对吧
发表于 2015-02-09 15:23:00 回复(0)