惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
爱范儿
爱范儿
小众软件
小众软件
K
Kaspersky official blog
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
V
Vulnerabilities – Threatpost
博客园_首页
Microsoft Security Blog
Microsoft Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
V2EX
C
Check Point Blog
S
Schneier on Security
P
Palo Alto Networks Blog
IT之家
IT之家
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
Project Zero
Project Zero
Y
Y Combinator Blog
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
S
Securelist
C
CERT Recently Published Vulnerability Notes
A
Arctic Wolf
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理

博客园 - 刘寅

一起来用Websocket(二):Websocket协议详细分析 一起来用Websocket-目录 一起来用Websocket(一)开篇 Websocket!Socket在HTML5复活 封闭式开发小记(11):封闭式开发的测试发布(制定版本规则,展现开发进度) 封闭式开发小记(10):封闭式开发的项目汇报(区分汇报类别和听众、争取最大认可) 封闭式开发小记(9):封闭式开发的最后一天(开发中的一些心情记录,和开发无关) 封闭式开发小记(8):封闭式开发的项目讨论 封闭式开发小记(7):如何和谐沟通、提高士气(结合开发实际冲突来深入讨论合作与沟通) 封闭式开发小记(6):封闭式开发的文档管理 封闭式开发小记(5):封闭式开发的敏捷开发 封闭式开发小记(4):封闭式开发的架构设计 封闭式开发小记(3):封闭式开发的人员配备 封闭式开发小记(1):封闭式开发的基本装备 封闭式开发小记(2):封闭式开发的时间安排 进程机制与并发程序设计-Linux下C实现-源码-makefile .NET 的 代码整洁之道 与 测试驱动开发 系列之(一)CleanCode 第14章 进程机制与并发程序设计-Linux下C实现(二) 生产者与消费者问题 操作系统常用页面置换算法模拟实验下载 07 zsb C练习上机(二)
进程机制与并发程序设计-Linux下C实现(一) 睡觉的理发师问题
刘寅 · 2007-12-24 · via 博客园 - 刘寅

               进程机制与并发程序设计-Linux下C实现(一) 睡觉的理发师问题

实验目的:
理解进程同步概念及实现的方法,去学习如何合理分配资源。
一、问题分析:
理发师问题:
一个理发店由一个有几张椅子的等待室和一个放有一张理发椅的理发室组成。
1. 若没有要理发的顾客,则理发师去睡觉;
2. 若一顾客进入理发店,理发师正在为别人理发,且等待室有空椅子,则该顾客就找张椅子按顺序坐下;
3. 若一顾客进入理发店,理发师在睡觉,则叫醒理发师为该顾客理发;
4. 若一顾客进入理发店且所有椅子都被占用了,则该顾客就离开。
二、伪码实现:
 

互斥信号量:mutex 用来互斥对临界变量count的访问

计数信号量 customers用来记录等候的顾客数据,barbers用来记录等待的理发师数,这里barbers只有两种取值,要不是0要不是1

临界变量:count由理发师进程和顾客进程共同访问,用来记录在椅子上等着的顾客数

              N 椅子数,为最多等候的顾客数

理发师进程

 1Barbers()
 2{
 3While(true)
 4{
 5    P(customers)
 6    P(mutex)
 7     Count--;
 8    V(mutex)
 9     V(barbers)
10    理发师理发;
11}

12}

13

顾客进程

 1Customer()
 2{
 3 While(true)
 4 {
 5  P(mutex);
 6  If(count<N)
 7  {
 8    Count++
 9        V(mutex);
10     V(customer)
11    P(barbers);
12     顾客被理发
13  }

14  else
15    V(mutex);
16 }

17}

18


三 、Linux实现[redhat 9.0]

 1//2007-12-23 10:46:11
 2
 3
 4#include <stdio.h>
 5#include <stdlib.h>
 6#include <unistd.h>
 7#include <pthread.h>
 8#include <errno.h>
 9#include <sys/ipc.h>
10#include <semaphore.h>
11#include <fcntl.h>
12#define  n 5 
13time_t end_time; /*end time*/
14sem_t mutex,customers,barbers;
15int count = 0;//等待理发的顾客数
16void barber(void* arg);
17void customer(void* arg);
18
19int main(int argc, char *argv[])
20{
21    
22    pthread_t id1,id2;
23    int ret = 0;
24    end_time = time(NULL)+20;
25    //初使化信号量的个数
26    sem_init(&mutex,0,1);
27    sem_init(&customers,0,0);
28    ret = sem_init(&barbers,0,1);
29    if(0!=ret)
30        perror("sem init.");
31    //初使化两个线程
32    ret = pthread_create(&id1,NULL,(void *)barber,NULL);
33    if(0!=ret)
34        perror("create barbers.");
35    ret = pthread_create(&id2,NULL,(void *)customer,NULL);
36    if(0!=ret)
37        perror("create customers.");
38    //让顾客进程先阻塞
39    pthread_join(id2,NULL);
40    pthread_join(id1,NULL);
41
42    exit(0);
43    }

44    
45    /*理发师进程*/
46    void barber(void *arg)
47    {
48        while(time(NULL)<end_time||count>0)
49        {
50                sem_wait(&customers);//p(customers)
51                sem_wait(&mutex);//p(mutex)
52                    count--;
53                  printf("Barber:cut hair,count is:%d.\n",count);
54                sem_post(&mutex);//v(mutex);
55                sem_post(&barbers);//v(barbers) 通知已进来的,在等理发师的顾客进程
56                sleep(3);
57        }

58    }
/*customer*/
59    
60    
61    /*顾客进程*/
62    void customer(void *arg)
63    {
64        while(time(NULL)<end_time)
65        {
66                sem_wait(&mutex);//p(mutex)
67                if(count<n)
68                    {
69                        count++;
70                        printf("Customer:add count,count is:%d.\n",count);
71                        sem_post(&mutex);//v(mutex)
72                        sem_post(&customers);//v(customers)
73                        sem_wait(&barbers);//p(barbers)
74                        }

75                        else
76                            {
77                                //v(mutex)  注意 如果个客户数已满了,则把互斥锁放掉,
78                                sem_post(&mutex);
79                            }

80                sleep(1);
81         }
/*end of     while(time()<end_time)*/ 
82}
/*customer*/
83

下载
五.参考文献
1.<最新UNIX程序设计编程技巧>
2.<嵌入式Linux应用程序开发详解>