文章目录

  • 生产者--消费者问题
    • 分析
    • 实现
  • 哲学家进餐问题
    • 方法一:最多4人同时拿左筷子,最终保证一人能进餐
    • 方法二:同时给左右筷子
      • 解法1:AND信号量
      • 解法2:信号量保护机制
    • 方法三:让奇数先左后右,让偶数先右后左
  • 读者--写者问题
    • 分析
    • 实现

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。点击这里

生产者–消费者问题

分析

  • P1~Pl 向BUFF存信息,C1~Cm 从BUFF取信息。
  • 不能对同一个信息既存又取,因此P进程和C进程互斥(mutex)
  • BUFF中有空位,P进程才能存信息(empty)
  • BUFF中有信息,C进程才能取信息(full)

实现

int in = 0, out = 0; // 在BUFF中要操作(存消息,取消息)的位置
item buff[n]; // 创建BUFF
semaphore mutex= 1, empty = n, full = 0;
void producer(){do{产生一个消息并放到nextp里wait(empty); // 先检验是否为空wait(mutex); // 后检验是否互斥。顺序颠倒,在满的情况下,// 会导致mutex无法释放,导致死锁buff[in] = nextp;in = (in+1)%n; // 让in指向下一个位置signal(mutex); // 释放互斥信号signal(full); // 放进去信息了,full+1}while(True)
}void consumer(){do{wait(full);wait(mutex);nextc = buff[out];out = (out+1) mod n;signal(mutex);signal(empty);消费nextc中的产品}while(True)
}void main(){cobeginproducer();consumer();coend
}

注意:

  • 每个进程中 wait(mutex)和 signal(mutex)成对存在
  • 整个程序中 wait(empty/full)和 signal(empty/full)成对存在
  • wait()顺序不能颠倒,先资源再互斥,避免死锁

哲学家进餐问题

方法一:最多4人同时拿左筷子,最终保证一人能进餐

semaphore chopsticks[5] = {1,1,1,1,1} // 5根筷子
semaphore r = 4 // 最多4个人同时拿左筷子
void ohilosopher(int i)
{while(true){think();wait(r);// 看看有几个人拿了左筷子wait(chopsticks[i]); // 拿左筷子wait(chopsticks[(i+1)mod 5]; // 拿有筷子eat(); // 吃signal(chopsticks[(i+1)) mod 5]; //给出筷子signal(chopsticks[i]);// 给出筷子signal(r); // 1个吃完了,又允许1个人拿左筷子了think();}
}

方法二:同时给左右筷子

解法1:AND信号量

semaphore chopsticks[5] = {1,1,1,1,1}
void philosopher(int i){while(true){think();Swait(chopsticks [i] ; chopstick[i+1] mod 5); // 用AND信号量同时给左右筷子eat(); // 吃Ssignal(chopstick[(i+1) mod 5];chopstick[i]) // 吃完释放一双筷子think();}
}

解法2:信号量保护机制

semaphore mutex = 1
semaphore chopsticks[5] = {1,1,1,1,1}
void philosopher(int i){while(true){think();wait(mutex);wait(chopstick[i]);wait(chopstick[(i+1) mod 5]);signal(mutex);eat();signal(chopstick[i]);signal(chopstick[(i+1) mod 5]);think();}
}

方法三:让奇数先左后右,让偶数先右后左

semaphore chopsticks[5] = {1,1,1,1,1]
void philosopher(int i){while(true){if(i mod 2 == 0){wait(chopstick[(i+1) mod 5);wait(chopstick[i]);eat();signal(chopstick[i]);signal(chopstick[(i+1) mod 5]);}else{wait(chopstick[i]);wait(chopstick[(i+1) mod 5);eat();signal(chopstick[(i+1) mod 5]);signal(chopstick[i]);}}
}

读者–写者问题

分析

  • 写者和写者之间互斥,写者和读者之间互斥
  • 只要有一个读者,写者就不能去写

实现

int Readcount = 0; // 记录有几个读者在读
semaphore rmutex = 1; // 读写互斥
semaphore wmutex = 1;// 读者之间对Readcount访问互斥
void Reader(){do{wait(rmutex);if (Readcount == 0) // 判断是否是第一个读者wait(wmutex);Readcount++;signal(rmutex);read();wait(rmutex);Readcount--;if (Readcount == 0){ // 判断是否是最后一个读者signal(wmutex);signal(wmutex);}while(true)
}void Writer(){while(true){wait(wmutex);写;signal(wmutex);}

本文哲学家进餐问题参考【操作系统】“哲学家进餐”问题

操作系统(四) | 经典进程的同步问题(生产者--消费者问题、哲学家进餐问题、读者--写者问题)相关推荐

  1. 计算机操作系统——经典进程的同步问题

    计算机操作系统--信号量机制与经典进程的同步问题 信号量机制 随着发展,信号量从整型信号量经记录型信号量,进而发展为"信号量集"机制. 一般来说,信号量的值与相应的资源的使用情况有 ...

  2. Qt之线程同步(生产者消费者模式 - QSemaphore)

     简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,此时,它将从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Semaphore(信号量) 比 mutex(互斥量)有 ...

  3. Qt之线程同步(生产者消费者模式 - QWaitCondition)

     简述 生产者将数据写入缓冲区,直到它到达缓冲区的末尾,这时,它从开始位置重新启动,覆盖现有数据.消费者线程读取数据并将其写入标准错误. Wait condition(等待条件)比单独使用 mut ...

  4. 进程管理---经典进程的同步问题及练习

    一.生产者–消费者问题 生产着消费者问题即多个生产者和消费者对n个缓冲区的使用. 若不考虑互斥.同步问题会导致counter计数错误. 无论生产者.消费者使用缓冲池时应保证互斥使用(互斥信号量mute ...

  5. 【操作系统-进程】PV操作——生产者消费者问题

    文章目录 生产者消费者问题的万能方法步骤 Step 1. 有几类进程 Step 2. 用中文描述动作 Step 3. 添加 PV 操作,用中文描述里面的操作 Step 4. 检查是否出现死锁 Step ...

  6. JAVA入门基础进阶(十四)—— 实现多线程、线程同步、生产者消费者

    文章目录 1.实现多线程 1.1简单了解多线程[理解] 1.2并发和并行[理解] 1.3进程和线程[理解] 1.4实现多线程方式一:继承Thread类[应用] 1.5实现多线程方式二:实现Runnab ...

  7. java 生产者消费者同步_经典线程同步问题(生产者消费者)--Java实现

    原创作品,转载请注明出自xelz's blog 生产者-消费者(producer-consumer)问题是一个著名的线程同步问题.它描述的是:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去 ...

  8. Java多线程(实现多线程、线程同步、生产者消费者)

    1.实现多线程 1.1简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 1.2并发和并行[理解] 并 ...

  9. Java学习笔记18:Java_Map集合_HashMap集合_可变参数_Stream流_多线程_线程同步_生产者消费者

    文章目录 1.Map集合 1.1Map集合概述和特点[理解] 1.2Map集合的基本功能[应用] 1.3Map集合的获取功能[应用] 1.4Map集合的遍历(方式1)[应用] 1.5Map集合的遍历( ...

最新文章

  1. RHEL/CentOS下的VLAN设置
  2. 如何给docker容器分配内存和cpu
  3. 5分钟上手写ECharts的第一个图表
  4. mac 下系统目录权限问题
  5. 数据挖掘(10):卷积神经网络算法的一个实现
  6. 平衡二叉树AVL插入
  7. 8 个弱点助我成为更好的开发人员!
  8. [转]ASP.NET Web API系列教程(目录)
  9. 国内外游戏运营模式区别
  10. web之线性渐变,径向渐变,重复渐变
  11. Aho - Corasick string matching algorithm
  12. codewars题目
  13. 阿里云国际站代理商:利用RDS MySQL数据库云开发ToDo List
  14. 5G/NR 网络共享(协议版)
  15. html首页我的待办,我的待办.html
  16. 银行系统(万里长征始于足下)
  17. 设计分享|单片机多音阶电子琴(汇编)
  18. Zynq-Linux移植学习笔记之17-Zynq下linuxPL部分Flash
  19. AM5728 arm端 spi调试 设备树方式
  20. html去掉nav的圆点,web前端分享HTML5中的nav标签

热门文章

  1. mysql报错ERROR 1206 (HY000): The total number of locks exceeds the lock table size的解决方法...
  2. 测试MVC3时关于Model Builder语句的更改
  3. HDU 2546 饭卡(贪心+DP)
  4. CentOS系统安装桌面
  5. 在你的Fckeditor安装Google map plugin
  6. 光棍的好处(漫画)-推荐. 节日快乐~~
  7. Paper Review: Bayesian Regularization and Prediction
  8. 实证会计理论与因果推断13 线性模型概述
  9. 了解Windows内核内存池
  10. 搜狗拼音输入法的安装和基本使用