在有N个缓冲区的生产者消费者的问题中,下列叙述中哪些是错误的?producer() { int item; while(TRUE) { item = produce_item(); P(empty); P(mutex); insert_item(item); V(mutex) V(full); } } consumer() { int item; while(TRUE) { P(full); P(mutex); item = remove_item(); V(mutex); V(mutex); consu

题目

在有N个缓冲区的生产者消费者的问题中,下列叙述中哪些是错误的?producer() { int item; while(TRUE) { item = produce_item(); P(empty); P(mutex); insert_item(item); V(mutex) V(full); } } consumer() { int item; while(TRUE) { P(full); P(mutex); item = remove_item(); V(mutex); V(mutex); consume_item(item); } }

A.信号量empty的初值为N

B.信号量full的初值为0

C.信号量mutex的初值为0

D.P(full)和P(mutex)两条语句可以颠倒顺序

E.V(mutex)和V(mutex)两条语句可以颠倒顺序


相似考题

1.试题四阅读以下说明和C代码,将应填入 (n) 处的字句写在答题纸的对应栏内。[说明]函数MultibaseOutput(long n, int B)的功能是:将一个无符号十进制整数n转换成B(2≤B≤16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把B进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C代码中的符号常量及栈的类型定义如下:#define MAXSIZE 32typedef struct {int *elem; /* 栈的存储区 */int max; /* 栈的容量,即栈中最多能存放的元素个数 */int top; /* 栈顶指针 */}Stack;[C代码]int InitStack(Stack *S, int n) /* 创建容量为n的空栈 */{ S->elem = (int *)malloc(n * sizeof(int));if(S->elem == NULL) return -1;S->max = n; (1) = 0 ; return 0;}int Push(Stack *S, int item) /* 将整数item压入栈顶 */{ if(S->top == S->max){ printf("Stack is full!\n"); return -1;}(2) = item ; return 0;}int StackEmpty(Stack S) { return (!S.top) ? 1 : 0; } /* 判断栈是否为空 */int Pop(Stack *S) /* 栈顶元素出栈 */{ if(!S->top) { printf("Pop an empty stack!\n"); return -1;}return (3) ;}void MultibaseOutput(long n, int B){ int m; Stack S;if (InitStack(&S, MAXSIZE)) {printf("Failure!\n"); return;}do {if (Push(&S, (4) )) {printf("Failure!\n"); return;}n = (5) ;}while(n != 0);while(!StackEmpty(S)) { /* 输出B进制的数 */m = Pop(&S);if(m < 10) printf("%d", m); /* 小于10,输出数字 */else printf("%c", m + 55); /* 大于或等于10,输出相应的字符 */}printf("\n");}

2.阅读以下说明和C程序代码,将应填入______处的语句写在答题纸的对应栏内。[说明]函数MultibaseOutput(long n,int B)的功能是:将一个无符号十进制整数n转换成 B(2≤B≤16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把B进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C代码中的符号常量及栈的类型定义如下:define MAXSIZE 32typedef struct{int * elem; /* 栈的存储区 */int max; /* 栈的容量,即栈中最多能存放的元素个数 */int top; /* 栈顶指针 */}Stack;[C代码]int InitStack(Stack * S,int n) / * 创建容量为n的空栈 */{ S->elem=(int *)malloc(n * sizeof(int));if(S->elem==NULL)return-1;S->max=n; (1)=O;return 0;}int Push(Stack * S,int item) / * 将整数item压入栈顶 * /{ if(S->top==S->max){ printf(“Stack is full! \n”);return-1;}(2)=item;return 0;}int StackEmpty(StackS) {return (! S.top)? 1:0;} / * 判断栈是否为空 * /int Pop(Stack *S ) / * 栈顶元素出栈 * /{ if(! S->top){printf(“Pop an empty stack! \n”);return-1;}return (3);}void MultibaseOutput(long n,int B){ int m;StackS;if (InitStack(&S,MAXSIZE)){printf(“Failure! \n”);return;}do {if(Push(&S, (4) )){printf(“Failure! \n”);return;}n=(5);}while(n!=0);while(! StackEmpty(S)){ / * 输出B进制的数 * /m=Pop(&S);if(m<10)printf(“%d”,m); / * 小于10,输出数字 * /else printf(“%c”,m+55); / * 大于或等于10,输出相应的字符 * /}printf(“\n”);}

更多“在有N个缓冲区的生产者消费者的问题中,下列叙述中哪些是错误的?producer() { int item; while ”相关问题
  • 第1题:

    include void main( ) { int n=9; while(n>6) { n--; cout < < n;} } 该程

    #include<iostream.h> void main( ) { int n=9; while(n>6) { n--; cout < < n;} } 该程序的输出结果是

    A.987

    B.876

    C.8765

    D.9876


    正确答案:B
    解析:该题目应该根据循环体第一次和最后一次执行时的输出结果来决定哪一项是正确的。第一次进入循环时,n的值是9,循环体内,先经过n--运算,n的值变为8,所以第一次的输出值是8,由此可以排除选项A)和选项D)。由循环条件n>6可以知道,最后一次循环开始时,n的值应该为7,所以最后一次执行循环体时输出为6,由此可以排除选项C)。注意:while与do-while的区别。

  • 第2题:

    下列程序是死循环的是

    A.for(;;);

    B.int s=36; while(S)--S;

    C.int m=10; do { m- - }while(m>0);

    D.int n=5; while(n>1) { n- -; if(n<0)break; }


    正确答案:A
    解析:在for语句中省略中间的判断表达,并且后面只有一个分号,所以是循环。

  • 第3题:

    下列程序是死循环的是 ( )

    A.for(;;)

    B.int s=36; while(s)=s;

    C.int m=10; do{m- -;}while(m>0);

    D.int n=5; while(n>1) { n- -; if(n<0)break; }


    正确答案:A

  • 第4题:

    下面程序的运行结果是( )。 include main() {int a,b,c,n; a=2;b=0;c=1;n=1; while(n<=3

    下面程序的运行结果是( )。 include<stdio.h> main() {int a,b,c,n; a=2;b=0;c=1;n=1; while(n<=3) {c=c*a;b=_b+c;++n;} printf("b=%d",B); }


    正确答案:B
    B 解析:分析程序可知,n的初始值为1,因此。while(n=3)循环3次。第1次:c=c*a=2;b=b+C=2;n=2。第2次:c=c*a=4;b=b+c=6;n=3。第3次:c=c*a=8;b=b+e=14。当n=4时,判断条件不满足,退出循环。

  • 第5题:

    下列给定程序中,函数fun()的功能是:依次取出字符串中所有的数字字符,形成新的字符串,并取代原字符串。

    请改正函数fun()中的错误,使它能得出正确的结果。

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

    试题程序:

    include <stdio.h>

    include <conio.h>

    void fun(char *s)

    {int i,j;

    for(i=0,j=0; s[i]!= '\0'; i++)

    if(s[i]>= '0'&&s[i]<= '9')

    /*************found**************/

    s[j]=s[i];

    /*************found**************/

    s[j]="\0";

    }

    main()

    {char item[80];

    clrscr();

    printf("\nEnter a string: ");gets(item);

    printf("\n\nThe string is:\%s\n", item);

    fun(item);

    printf("\n\nThe string of changing is :

    \%s\n",item);

    }


    正确答案:(1)错误;s[j]=s[i]; 正确:s[j++]=s[i]; (2) 错误:s[j]="\0"; 正确:s[j]='\0';
    (1)错误;s[j]=s[i]; 正确:s[j++]=s[i]; (2) 错误:s[j]="\0"; 正确:s[j]='\0'; 解析:有循环条件if(s[i]>='0'&&s[i]='9')以及题目要求“依次取出字符串中所有的数字字符”可知,s[j]=s[i];表述错误。s[j]="\0";中是一个常识性语法错误,学习者只要在平时训练的时候注意一下就可以了。

  • 第6题:

    下面程序的输出结果是()。includeusing namespace std;int main(){int n=10;while(n>7

    下面程序的输出结果是( )。 #include<iostream> using namespace std; int main() { int n=10; while(n>7){ n--; cout<<11<<','; } cout<<endl; }

    A.10,9,8,

    B.9,8,7,

    C.10,9,8,7,

    D.9,8,7,6,


    正确答案:B

  • 第7题:

    av9功能是求整形数组中的前若干个元素的平均值,设数组元素个数最多不超过则下列函数说明语句错误的是( )。

    A.int avg(int*a,int n);

    B.int avg(int a[lO],int n);

    C.int avg(int a,int n);

    D.int avg(int a[],int n);


    正确答案:C
    对于数组参数传递时C语言中内部都使用指针进行传递,而C选项中形参为两个int型的值,所以答案选择C。

  • 第8题:

    定义如下变量: int n=10; 则下列循环的输出结果是( )。 while(n>7) { -n; printf("%d\n",n); }

    A.1098

    B.987

    C.10987

    D.9876


    正确答案:B
    解析:第1次循环,10>7,--n=9,输出9。第2次循环,9>7,--n=8,输出8。第3次循环,8>7,--n=7,输出7。

  • 第9题:

    下列选项中,不能输出100个整数的是( )。A.for(int i=0;i<100;i++) System.out.println(i);B.int

    下列选项中,不能输出100个整数的是( )。

    A.for(int i=0;i<100;i++) System.out.println(i);

    B.int i=0; do{ System.out.println(i); i++; }while(i<100);

    C.int i=0; while(i<100){ System.out.println(i); i++; }

    D.int i=0; while(i<100){ i++; if(i<100)continue; System.OUt.println(i); }


    正确答案:D
    D。【解析】continue语句的作用是不执行循环体后面的语句直接进入循环判断阶段。所以本题选D。

  • 第10题:

    ()阅读下列说明和C语言程序,将应填入 (n)处的语句写在答题纸的对应栏内。[说明]设有定义 #define ITEM struct item #define SIZE sizeof(ITEM) ITEM { int num; ITEM *next; }; ITEM *head=NULL; 下述函数定义实现按插表尾形式(即每一新表元素插入至当前所生成链表的表尾之后)生成一个正向线性链表。最后指向所生成链表表头的指针作为函数值返回。为生成一个线性链表,要求输入一批整型数据,并以-1作为结束标志。请填空完善程序。 ITEM *gene(ITEM *head) { ITEM *temp,*tail;/*tail指向当前链表尾结点*/ int intno; printf("Enter integer NO.,-1 to stop:\n"); scanf("%d",&intno); while (intno!=-1) { temp=(____(1)_____)malloc(SIZE); temp->num=intno; if (head==_____(2)_____) /*空表*/ { head=temp; tail=______(3)______; } else /*非空表*/ { ____(4)_______=temp; tail=temp; } scanf("%d",&intno); } return (_______(5)_______);


    正确答案:()
    (1)ITEM *   (2)NULL   (3)temp   (4)tail->next   (5)head
    本题是一典型的单链表建立的题目,创建一个指针和一个尾指,然后创建新结点,逐点加入,最后返回头指针。终止条件是输入的是否为“-1”,用一个while 循环来实现创建多个结点及链上。所以第一空处的语句是开辟新结点。固定句法,填入:ITEM *  。然后把刚输入的值保存在新结点的值域,再将新结点挂在头结点(指针),先要看头指针是不是空表,head==NULL;若是,则将头指针指新建的第一个结点,尾指针也指向它。若非空表,则将新建的结点挂在链表的尾结点的指针域上,故第(4)空要填:tail->next;然后尾指针指向它。依据题意要返回链表,故要将链表头指针head返回。

  • 第11题:

    单选题
    有9个生产者,6个消费者,共享容量为8的缓冲区。在这个生产者-消费者问题中,互斥使用缓冲区的信号量mutex的初值应该为()。
    A

    1

    B

    6

    C

    8

    D

    9


    正确答案: B
    解析: 暂无解析

  • 第12题:

    单选题
    下列函数原型声明中,错误的是(  )。
    A

    int function(int m,int n);

    B

    int function(int,int);

    C

    int function(int m=3,int n);

    D

    hat function(int&m,int&n);


    正确答案: A
    解析:
    在C++中,函数在使用之前要预先声明,语法为:<返回类型><函数名>(<形参列表>)。使用函数原型说明有两种形式:①直接使用函数定义的头部,并在后面加上分号;②在函数原型说明中省略参数列表中的形参变量名,仅给出函数名、函数类型、参数个数及次序。C项错误,如果一个函数中有多个参数,则默认参数应从右至左逐个定义,第一个形参m有默认值,而第二个形参n没有默认值,不符合C++语法规定。

  • 第13题:

    有9个生产者,6个消费者,共享容量为8的缓冲区。在这个生产者-消费者问题中,互斥使用缓冲区的信号量mutex的初值应该为( )。

    A.1

    B.6

    C.8

    D.9


    参考答案:A

  • 第14题:

    本题程序中实现了一个“生产者一消费者问题”。生产者产生一个随机数存入DataPool类中,消费者从中取出数据。DataPool类一次只能存放一个数据。请更正题中带下划线的部分。

    注意:不改变程序的结构,不得增行或删行。

    class DataPool

    {

    private int data;

    private boolean isFull;

    public DataPool()

    {

    isFull=false;

    }

    public synchronized void putData(int d)

    {

    if(isFull= =true)

    {

    try

    {

    this.notify();

    }

    catch(InterruptedException e)

    {}

    }

    data=d;

    isFull=true;

    System.out.println("生产了一个数据:"+data);

    this.notify();

    }

    public synchronized int getData()

    {

    if(isFull= =false)

    {

    try

    {

    this.wait();

    }

    catch(InterruptedException e)

    {}

    }

    isFull=false;

    System.out.println("消费了一个数据"+data);

    this.wait();

    return this.data;

    }

    boolean getIsFull()

    {

    return isFull;

    }

    }

    class Producer extends Thread

    {

    DataPool pool;

    public Producer(DataPool pool)

    {

    this.pool=pool;

    }

    public void run()

    {

    for(int i=0; i<10; i++)

    {

    int data=(int) (Math.random()*1000);

    try

    {//用于生产数据

    sleep(data);

    }

    catch(InterruptedException e)

    {}

    pool.putData(data);

    }

    }

    }

    class Consumer implements Runnable

    {

    DataPool pool;

    public Consumer(DataPool pool)

    {

    this.pool=pool;

    }

    public void run()

    {

    for(int i=0; i<10; i++)

    {

    int data=pool.getData();

    try

    {//用于处理数据

    sleep((int) (Math.random()*1000));

    }

    catch(InterruptedException e)

    {}

    }

    }

    }

    public class advance

    }

    public static void main(String[] args)

    {

    Data Pool pool=new Data Pool();

    Producer pro=new Producer(pool);

    Runnable con=new Consumer(pool);

    Thread conTh=new Thread(con);

    &n


    正确答案:this.wait() this.notify() thread.sleep((int)(Math.random()*1000))
    this.wait() this.notify() thread.sleep((int)(Math.random()*1000)) 解析:本题考查知识点:多线程同步与互斥、线程的概念和实现方法。解题思路:Data Pool是一个用来存放数据的缓冲池,其中可以存放一个血型数据,变量isFull作为标志量,标志该缓冲池中是否有数据。Put Data()方法负责向Data Pool中存放数据,本方法调用成功,缓冲池中就存入了数据,getData()方法负责从DataPool中获得数据,本方法调用成功,缓冲池就为空。Producer类负责产生随机数据,然后将数据存放到DataPool中。Consumer类负责才能够从DataPool中取出数据。Producer和Consumer共享同一个Data Pool对象。当某个线程进入synchronized块后,共享的数据并不一定能满足该线程的需要,这样线程就需要等待其他线程修改共享数据,直到满足需要以后才继续执行,但是当前线程必须释放锁以使得其他线程可以运行。wait()和notify()方法是实现线程之间通信的两个方法。wait()用来释放线程拥有的锁,使线程进入等待队列;notify()用来唤醒等待队列中的线程,并把它加入到申请锁的队列。本题中生产者在DataPool有数据的情况下需要进入等待消费者取出数据,所以需要调用wait()方法,因此第1个下划线的地方应该改为this.wait()。消费者线程在取出数据以后,必须通知生产者线程DataPool中已经没有数据了,因此第2个下划线的地方改为this.notify()。第3个下划线的地方,考查常用的线程类的使用。Runnable接口的目的是使任何类都可以为线程提供线程体,但它本身并不是线程,所以并不能直接调用Thread类的方法,需要改为 thread.sleep。

  • 第15题:

    下列函数原型声明中,错误的是

    A.int function(int m,int n);

    B.int function(int,int);

    C.int function(int m=3,int n);

    D.int function(int&m,int&n);


    正确答案:C
    解析:在函数原型中指定默认参数值时,如果函数中有多个参数,则默认参数应从右至左定义,否则就是无效的,故本题选C。

  • 第16题:

    avg函数的功能是求整型数组中的前若干个元素的平均值,设数组元素个数最多不超过10,则下列函数说明语句错误的是

    A)int avg(jnt *a,int n.);

    B)int avg(int a[10],int n);

    C)int avg(int a,int n);

    D)int avg(int a[ ],int n);


    正确答案:C
    【答案】C
    【知识点】数组名作为函数参数的使用方法
    【解析】C语句中的两个形参均为整形变量不能接收数组元素中的值。

  • 第17题:

    int Calc(unsigned int x)

    {

    int count=0;

    while(x)

    {

    printf("x=%i\n",x);

    count++;

    x=x&(x-1);

    }

    return count;

    }

    问 Calc(9999)的值是多少。


    正确答案:
     

  • 第18题:

    下列给定程序中函数fun()的功能是计算1/n!的值。

    例如:给n输入5,则输出0.0083330

    请改正程序中的错误,使它能得到正确结果。

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

    试题程序:

    include <stdio.h>

    include <conio.h>

    /******+****found*************/

    int fun(int n)

    {double result=1.0;

    if(n==0)

    return 1.0;

    while(n>1 && n<170)

    /**********found************/

    result *=n++;

    result=1/result;

    return result;

    }

    main()

    {

    int n;

    printf("Input N:");

    scanf("%d",&n);

    printf("\n1/%d!=%If\n",n,fun(n));

    }


    正确答案:(1)错误:int fun(int n) 正确:double fun(int n) (2)错误:result*=n++; 正确:result*=n--;
    (1)错误:int fun(int n) 正确:double fun(int n) (2)错误:result*=n++; 正确:result*=n--; 解析:错误1:函数的返回值为实型数据,所以函数的返回类型应为double。错误2:根据阶乘的概念,从n开始,每递减1的数相乘,直到1,因此此处n递减,而不是递增。

  • 第19题:

    下列给定程序中,函数fun()的功能是:依次取出字符串中所有的字母,形成新的字符串,并取代原字符串。

    请改正程序中的错误,使它能得到正确结果。

    注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

    试题程序:

    include<stdio.h>

    include<conio.h>

    void fun(char*S)

    {

    int i,j;

    for(i=0,j=0;s[i]! ='\0';i++)

    /*************found************/

    if((s[i]>='A'&&s[i]<='Z')&&(s[i]>= 'a'&&S[i]<='z',))

    s[j++]=s[i];

    /*************found*************/

    s[j]=“\0”;

    }

    main()

    {

    char item[80];

    clrscr();

    printf(“\nEnter a string:”);

    gets(item);

    printf(“\n\nThe string is:\%S\n",item);

    fun (item);

    printf("\n\nThe string of changing

    is:\%S\n",item);

    }


    正确答案:(1)错误:if(s[i]>='A'&&s[i]='Z')&&(s[i]>='a'&&s[i]='z')) 正确:if((s[i]>='A'&&s[i]='Z')||s[i]>='a'&&s[i]='z')) (2) 错误:s[j]="\0" 正确:s[j]='\0'
    (1)错误:if(s[i]>='A'&&s[i]='Z')&&(s[i]>='a'&&s[i]='z')) 正确:if((s[i]>='A'&&s[i]='Z')||s[i]>='a'&&s[i]='z')) (2) 错误:s[j]="\0" 正确:s[j]='\0' 解析:错误1:字母包括小写字母和大写字母,这里是“或”的关系,所以用“||”运算符。错误2:字符串的结束标志符为字符,而不是字符串。

  • 第20题:

    有如下程序:includemain(){ int n=9;while(n>6){n--;printf("%d",n);}}该程序的输出结

    有如下程序: #include<stdio.h> main() { int n=9; while(n>6){n--;printf("%d",n);} } 该程序的输出结果是( )。

    A.987

    B.876

    C.8765

    D.9876


    正确答案:B
    解析:该程序应根据循环体第一次和最后一次的输出结果来决定哪一项是正确的。第一次进入循环时,n的值是9,在循环体内,经过n--运算后,n的值变为8,所以第一次的输出值是8,由此排除选项A)和D)。由循环条件n>6可知,最后一次循环开始时,n值为7,所以最后一次执行循环体输出的n值为6,由此排除选项C)。

  • 第21题:

    下列各程序段中,不是死循环的是( )。

    A.int j=100;

    B.for(;;) while(1) {j=j%100+1; if(j>1000) break; }

    C.int n=0;

    D.int m=36; do{ while(m)--m; ++n; }while(n>=0);


    正确答案:D
    解析:本题考查三种循环语句的结束条件。对于选项A,它的条件表达式1永远为真,故循环永远不会停止,是死循环;对于选项B,它的条件表达式为空,也是死循环;对于选项C,它的条件表达式(n>=0)总是成立,故也是死循环;对于选项D,当m减到小于0时,它的条件表达式结果为假(false),循环结束。

  • 第22题:

    有9个生产者,6个消费者,共享容量为8的缓冲区。在这个生产者-消费者问题中,互斥使用缓冲区的信号量mutex的初值应该为()。

    • A、1
    • B、6
    • C、8
    • D、9

    正确答案:A

  • 第23题:

    单选题
    avg函数的功能是求整型数组中的前若干个元素的平均值,设数组元素个数最多不超过10,则下列函数说明语句错误的是(  )。
    A

    int avg(int *a,int n);

    B

    int avg(int a[10],int n);

    C

    int avg(int a,int n);

    D

    int avg(int a[],int n);


    正确答案: C
    解析:
    C项,函数第一个形参的数据类型是int型,只能传递单个整型数值。而a表示整型数组的首地址,不能直接传递给它,因此不符合题目要求,声明不正确。答案选择C选项。