精华内容
下载资源
问答
  • 互斥使用
    万次阅读 多人点赞
    2021-03-26 21:38:14

    三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。
    P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;
    P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;
    P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。
    请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。

    //首先定义信号量
    //因为缓冲区是共享的,所以需要一个信号量
    semaphore  mutex=1;
    //进程P1和P2需要一个信号量
    semaphore odd=0;
    //进程P1和P3需要一个信号量
    semaphore even=0;
    //P1、P2和P3共享的缓冲区的空位需要一个
    semaphore empty=N;
    然后开始实现每一个进程
    P1(){
    	while(true){
    		p(empty);
    		num = produce();
    		p(mutex);
    		put();
    		v(mutex);
    		if(num%2 == 0)
    			v(even);
    		else
    			v(odd);
    	}
    	
    }
    

    其余两个则是类似的思路来进行分析

    P2(){
    	while(1){
    		p(odd);
    		p(mutex);
    		getodd();
    		countodd();
    		v(mutex);
    		v(empty);
    	}
    }
    
    P3(){
    	while(1){
    		p(even);
    		p(mutex);
    		geteven();
    		counteven();
    		v(mutex);
    		v(empty);
    	}
    }
    

    以上就是这道题的一个基本思路了,如果觉得还可以的话,就请点个赞对作者支持一下吧。

    更多相关内容
  • vc++中使用临界区CriticalSection的例子.zip
  • 临界区的互斥控制_SetEvent置句柄为有信号状态配合WaitForSingleObject使用_INFINITE等待其运行结束
  • 三个进程互斥使用缓存区问题

    千次阅读 2020-10-07 19:58:11
    三个进程互斥问题 //伪代码 semaphore F = 1;//实现对缓冲区的互斥访问 int odd_num = 0;//奇数个数 int even_num = 0;//偶数个数 int N;//缓冲区单元数 P1() { while(1) { if(odd_num+even_num<N)//当缓冲...

    三个进程互斥使用缓存区问题

    问题

    三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。
    P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;
    P2每次用getodd0从该缓冲区中取出一个奇数并用countodd0统计奇数个数;
    P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。
    试用信号量的P、V操作设计该问题的同步算法,给出所用共享变量(如果需要)和信号量及其初始值,并说明各自的含义。

    代码

    //伪代码
    semaphore F = 1;//实现对缓冲区的互斥访问
    int odd_num = 0;//奇数个数
    int even_num = 0;//偶数个数
    int N;//缓冲区单元数
    P1()
    {
    	while(1)
    	{
    		if(odd_num+even_num<N)//当缓冲区内有空单元
    		{ 
    			P(F);//加锁
    			produce();
    			if (num_is_odd)//该数是奇数
    			{
    				odd_num++;//奇数个数加1
    			}
    			else//该数是偶数
    			{
    				even_num++;//偶数个数加1
    			}
    			put();
    			V(F);//解锁
    		}
    	}
    }
    P2()
    {
    	while (1)
    	{
    		if(odd_num>0)//当缓冲区内奇数大于零
    		{ 
    			P(F);
    			getodd();
    			odd_num=countodd();
    			V(F);
    		}
    	}
    }
    P3()
    {
    	while (1)
    	{
    		if (even_num > 0)//当缓冲区内偶数大于零
    		{
    			P(F);
    			geteven();
    			even_num =counteven();
    			V(F);
    		}
    	}
    }
    

    好像没什么障碍

    展开全文
  • 互斥问题:三个进程彼此互斥访问缓冲区 【坑】 不要误以为这是读者写者问题,读者写者问题是针对“共享文件”的访问,所以多个读者之间不存在互斥关系 但是这里是“缓冲区”,这其实只是一个单生产者多消费者问题...

    【问题分析】

    同步问题:n个缓冲区单元,缓冲区有空位置时才能写;有奇数才能读出奇数,有偶数才能读出偶数

    互斥问题:三个进程彼此互斥访问缓冲区

    【坑】

    不要误以为这是读者写者问题,读者写者问题是针对“共享文件”的访问,所以多个读者之间不存在互斥关系,但是这里是“缓冲区”,一次两个读者也只能互斥访问,这其实只是一个单生产者多消费者问题而已,对应教材中的“吸烟者问题”

    【代码】

    semaphore mutex=1;//互斥访问缓冲区;
    semaphore empty=n;//缓冲区中有n个单元
    semaphore odd=0;//记录奇数个数
    semaphore even=0;//记录偶数个数
     
    void p1(){
     
        while(true){
            
            int x=produce();//生产一个数据x
    
            p(empty);//消耗掉一个空单元
          
            p(mutex);//互斥访问缓冲区;
            put(x);
            v(mutex);
    
            if(x%2==0)
                v(even);
            else
                v(odd);
        }
     
    }
    
    void p2(){
    
     while(true){
    
            p(odd);//有奇数才能取奇数出来
    
            p(mutex);
            getodd();
            v(mutex);
    
            v(empty);//产生一个空单元
          
            countodd();
        }
    
    }
    
    void p3(){
    
     while(true){
    
            p(even);
    
            p(mutex);
            geteven();
            v(mutex);
    
            v(empty);
          
            counteven();
        }
    
    }
    
    

     

    展开全文
  • 1.问题描述 ...三个进程彼此之间互斥的访问缓冲区,设置互斥信号量mutex。 3.注意事项 1.不要误认为是读者-写者问题,注意这里P2、P3之间也是互斥的,而读者之间的访问可以同时,这里只是单生产者多消费

    1.问题描述

    在这里插入图片描述

    2.问题分析

    同步问题:
    (1)包含N个缓冲区单元,有空位置时才能写,即P1、P2、P3共享缓冲区空位,设置同步信号量empty;
    (2)存在奇数时才能读出奇数,P1、P2共享奇数缓冲区,设置同步信号量odd;
    (3)存在偶数时才能读出偶数,P1、P3共享偶数缓冲区,设置同步信号量even。
    互斥问题:
    三个进程彼此之间互斥的访问缓冲区,设置互斥信号量mutex。

    3.注意事项

    1.不要误认为是读者-写者问题,注意这里P2、P3之间也是互斥的,而读者之间的访问可以同时,这里只是单生产者多消费者问题;
    2.对缓冲区的互斥访问使用mutex变量对三个进程进行约束即可,不需要在P2、P3之间单独添加约束变量。

    4.伪代码实现

    Shared Data:

    semaphore mutex=1;//互斥访问共享缓冲区;
    semaphore empty=N;//共享缓冲区同步信号量
    semaphore odd=0;//奇数缓冲区同步信号量
    semaphore even=0;//偶数缓冲区同步信号量
    

    The P1 Process

     	do{
            int num=produce();//生产一个数据num
     
            wait(empty);//消耗掉一个空单元
            wait(mutex);//互斥访问缓冲区;
            
            put(num);//将数据num放入缓冲区
            
            signal(mutex);
            if(num%2!=0)//奇数
                signal(odd);
            else//偶数
                signal(even);
        }while(true);
    

    The P2 Process

      do{
            wait(odd);//有奇数时才能取出奇数
      		wait(mutex);//互斥访问缓冲区
           
            getodd();//取出奇数
            
            signal(mutex);
            signal(empty);//产生一个空单元
          
            countodd();//奇数个数加一
        }while(true);
    

    The P3 Process

      do{
            wait(even);//有偶数时才能取出偶数
            wait(mutex);
            
            geteven();
            
            signal(mutex);
            signal(empty);
          
            counteven();
        }while(true);
    

    5.问题参考

    https://blog.csdn.net/weixin_45385429/article/details/115255883
    https://blog.csdn.net/qq_39328436/article/details/109956241
    https://blog.csdn.net/qq_38900441/article/details/83350728

    展开全文
  • 而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起配合使用使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。...
  • 主要介绍了Java使用synchronized实现互斥锁功能,结合实例形式分析了Java使用synchronized互斥锁功能简单实现方法与操作技巧,需要的朋友可以参考下
  • 设系统中有R类资源m个,现有n个进程互斥使用。若每个进程对R资源的最大需求为w,那么当m、n、w取下表的值时,对于下表中的a~e五种情况, (8) 两种情况可能会发生死锁。对于这两种情况,若将 (9) ,则不会发生...
  • 使用互斥锁和共享内存实现的非阻塞FIFO,另外代码中有包含信号量的实现。个人测试稳定,有一些注释,一起学习。如有问题,欢迎讨论。
  • 互斥使用不当导致线程阻塞

    千次阅读 2019-03-05 17:00:07
    互斥使用不当导致线程阻塞@TOC 写作目的 多线程之间通过消息队列进行进程间通信,在线程内部互斥使用不当,导致线程阻塞。花费了比较多的时间去定位,故整理下自己所犯的错误,也为后来阅读者起一个提示作用,...
  • 有时Powershell的函数需要互斥,让用户只能在其中二选一。 要给脚本创建一组互斥的参数,可以给他们打上不同的属性标志,同时确保它们的唯一性(假设不能自动识别参数类型). function Test-ParameterSet { ...
  • 内容索引:VC/C++源码,其它分类,MFC,互斥 VC++ 使用MFC类创建互斥对象,通过这个小程序,你可以了解到声明线程函数、定义全局互斥对象、定义线程句柄、创建线程、程序睡眠、锁定互斥对象、变量自加、线程睡眠、释放...
  • 在做多线程开发时,互斥锁是必不可少的。但c语言不像c++11有标准的线程库,在各种编译器支持的平台都可以使用。而且跨平台开发中,在业务逻辑里写不同平台的兼容代码,容易造成过多的冗余,以及代码结构过于复杂的...
  • 操作系统实验(三)线程的互斥 操作系统实验(三)线程的互斥
  • Java互斥锁简单实例

    2020-09-03 13:27:19
    主要介绍了Java互斥锁,较为详细的分析了java互斥锁的概念与功能,并实例描述了java互斥锁的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 多线程freertos互斥

    2021-10-03 15:30:16
    app可快速进行应用无需烦锁的创建
  • 使用-互斥

    2021-02-13 17:30:20
    使用-互斥
  • 摘要:VC/C++源码,系统相关,多线程 VC如何使用互斥量创建进程,教你如何使用互斥量,新手学习可下载参考.
  • 使用Linux线程信号量和互斥量实现读者写者问题。要求:要求:①允许多个读者可以同时对文件执行读操作;②只允许一个写者往文件中写信息;③任一写者在完成写操作之前不允许其他读者或写者工作;④写者执行写操作前...
  • QML中多个RadioButton的互斥使用及Button添加下拉菜单
  • 多线程编程:互斥使用。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”可执行...
  • 使用临界区来实现多线程的同步互斥.critical section
  • 主要介绍了PHP程序中的文件锁、互斥锁、读写锁使用技巧解析,其中重点讲解了sync模块和pthreads模块中的使用实例,需要的朋友可以参考下
  • 本代码演示了用互斥实现线程间的同步。 关键字:CMutex,互斥,线程同步
  • 例程是hook了CreateMutexA函数,创建互斥体时会自动修改互斥体名称。@冬夜静思念。Tags:CreateMutexA。
  • 本代码演示了利用临界区实现线程的同步。
  • 本篇文章主要介绍了Vue2.0 实现单选互斥的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 346,192
精华内容 138,476
关键字:

互斥使用