问题描述


三个烟鬼问题实际上就是线程的并发问题:

  • 三个烟鬼,一个有烟草,一个有烟纸,一个有火柴
  • 上帝拿走两个人的材料给一个人,那么你那个人可以抽一支烟
  • 当那个人抽完这只烟的时候,上帝重新做决策

题目分析:


-其实就是有前提条件的同步问题:

  • “上帝给材料才能抽烟”
  • “当前抽烟的抽完上帝才能指派下一个人”
  • 同时只会有一个人在抽烟

基本思路:


  • 首先考虑上帝:

    • 上帝指派人的时候,不能有人在抽烟,所以需要一个信号量标记是否有人在抽烟:

      • 1代表当前没有人正在抽烟
      • 0代表当前有人正在抽烟
        - 上帝指派之后会更新一个烟鬼的信号量使它可以抽烟,然后上帝等待烟鬼抽完烟再进行重新指派
  • 烟鬼要等待上帝指派,才能抽烟,所以每个烟鬼有一个信号量
    • 1代表当前有权利抽烟
    • 0代表还需继续等待
    • 抽完烟更新smoking状态唤醒上帝

代码如下:


#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>#define TRUE 1
#define MAX 3
#define p(x) sem_wait(&x)
#define v(x) sem_post(&x)sem_t smoker[MAX],smoking;void init ( )
{int i;for ( i = 0 ; i < MAX ; i++ )sem_init ( &smoker[i] , 0 , 0 );sem_init ( &smoking , 0 , 1 );
}void* _judge ( )
{while ( TRUE ){p(smoking);int x = (rand()%MAX+MAX)%MAX;v(smoker[x]);}
}void* _smoker ( void* arg )
{int *p = (int*)arg;int x = *p;while ( TRUE ){p(smoker[x]);printf ( "%dth smoker smoking....\n" , x );sleep(1);v(smoking); }
}int main ( )
{init ( );pthread_t sid[MAX],jid;int sid1[MAX];int i;srand ( (unsigned)time(NULL));pthread_create ( &jid , NULL , _judge , NULL );for ( i = 0 ; i < MAX; i++ ){sid1[i] = i;pthread_create ( &sid[i] , NULL , _smoker , &sid1[i] );}for ( i = 0 ; i < MAX ; i++ )pthread_join ( sid[i] , NULL );
}

进程(线程)间同步互斥问题(四) 三个烟鬼问题相关推荐

  1. 进程(线程)间同步互斥问题(三) 熟睡的理发师问题

    问题描述: 熟睡的理发师问题描述的是多个进程(线程)之间的通信与同步问题: 有一个理发师的椅子,和n个顾客的椅子 如果有顾客在椅子上等,那么理发师为他剪发,否则理发师就在自己的椅子上睡觉. 如果理发师 ...

  2. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  3. IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信

    文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...

  4. python线程死锁的原因,浅谈Python线程的同步互斥与死锁

    线程间通信方法 1. 通信方法 线程间使用全局变量进行通信 2. 共享资源争夺 共享资源:多个进程或者线程都可以操作的资源称为共享资源.对共享资源的操作代码段称为临界区. 影响 : 对共享资源的无序操 ...

  5. python同步锁和互斥锁的区别_浅谈Python线程的同步互斥与死锁

    这篇文章主要介绍了浅谈Python线程的同步互斥与死锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 线程间通信方法 1. 通信 ...

  6. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!

    作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...

  7. LinuxC高级编程——线程间同步

    LinuxC高级编程--线程间同步 宗旨:技术的学习是有限的,分享的精神是无限的. 1. 互斥锁mutex 多个线程同时访问共享数据时可能会冲突.对于多线程的程序,访问冲突的问题是很普遍的,解决的办法 ...

  8. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行

    基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程 ...

  9. linux的进程与线程通信方式,Linux的进程/线程间通信方式总结

    Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程 ...

最新文章

  1. 数字取整或保留小数四舍五入的正确写法
  2. Hadoop生态Flume(四)拦截器(Interceptor)介绍与使用(2)
  3. 微信JSAPI支付,报错当前页面的URL未注册
  4. js 异步执行_JS Asynchronous — JS 异步编程极简史
  5. 触发器 索引视图 游标 事务
  6. 「 Luogu P2230 」X 「 Vijos 1142 」 HXOS系统
  7. web开发性能优化---安全篇
  8. 第十三届蓝桥杯c++b组2022年国赛决赛题解
  9. 使用DroidCam过程中所遇到的问题及处理方法
  10. AE的QuickTime问题
  11. uniapp 下载视频到本地
  12. 16张图带你由微信大数据看中国人的国庆长假
  13. 微信小程序canvas画价格走势图(六)
  14. Azure入门-云计算
  15. 微信公众号运营靠谱吗?怎么样判断公司需要代运营?
  16. 海龙科技荣获2011年IP-Guard企业信息安全监管系统深圳地区最高白金代理商
  17. 廖雪峰python教程杨辉三角_廖雪峰--python教程:笔记三
  18. ssm在线考试系统设计与实现(论文+程序设计+数据库文件)下载
  19. 想学神经调控-价格你来定
  20. 【Axure教程】调用b站视频播放器

热门文章

  1. Java程序员想拿百万年薪?你只需要这样做!
  2. 利用欧拉四面体公式求任意三棱锥的体积
  3. linux指令如何删除线程,linux基本命令学习02
  4. 计算机 标量,什么是标量机?标量、向量、张量的区别
  5. 代码漏洞扫描常见漏洞
  6. 火车票在开车前多长时间停止取票?
  7. 离散数学 命题表达式计算器
  8. 制造焦虑的医美平台,打碎医美行业的“信任之镜”
  9. MacDown的使用规范总结
  10. 控制工程,拉普拉斯变换笔记