网络视频直播系统 springcloud redux pdo clojure menu xsd jquery的点击事件 jquery遍历对象 jquery通过class获取元素 查看kafka消费情况 idea生成main方法 js获取月份 android调试工具 windows杀死进程命令 plsql连接mysql kafka启动命令 java 大文件上传 python网络编程 pythonlist python3文件操作 python等待10秒 python建站 java基础课程 java实例变量 java代码 右键菜单背景 冬青鼠 虚拟打印机安装 疯狂java php小数点保留2位 unity3d中文版 手工画像 方正兰亭粗黑字体下载 相册制作工具 淘宝店铺采集 保卫萝卜沙漠7攻略 文字图片制作 速查表 HTA
当前位置: 首页 > 学习教程  > 编程语言

进程同步与互斥——吸烟者问题源码实现(cigarette smoker’s problem)

2021/2/13 17:21:22 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

问题描述: 假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但要卷起并抽掉一支烟, 抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草,第二个拥有纸,第三…

问题描述

假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但要卷起并抽掉一支烟, 抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草,第二个拥有纸,第三个拥有胶水。供应者进程无限地提供三种材料,供应者每次将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者一个信号告诉已完成,此时供应者就会将另外两种材料放到桌上,如此重复(让三个抽烟者轮流地抽烟)。

问题分析:

1)关系分析。供应者与三个抽烟者分别是同步关系。由于供应者无法同时满足两个或以上的抽烟者,三个抽烟者对抽烟这个动作互斥(或由三个抽烟者轮流抽烟得知)。

2)整理思路。显然这里有4个进程。供应者作为生产者向三个抽烟者提供材料。

3)信号量设置。信号量offerl, offer2, offer3分别表示烟草和纸组合的资源、烟草和胶水组合的资源、纸和胶水组合的资源。信号量finish用于同步吸烟者和供应商进程,供应商需要等待一个吸烟者吸完烟,再提供下一个资源,吸烟者要通过finish信号量告诉供应商,我吸完烟了。

int random;     //储存随机数
semaphore offer1 = 0;   //定义信号量对应烟草和纸组合的资源
sempahore offer2 = 0;   //定义信号量对应烟草和胶水组合的资源
semaphore offer3 = 0;   //定义信号量对应纸和胶水组合的资源
semaphore finish = 0;   //定义信号量表示抽烟是否完成

void supplier_process()
{
	while(1)
	{
		random = random % 3;
		if(random == 0)
		{
			V(offer1);
		}
		else if (random == 1)
		{
			V(offer2);
		}
		else
		{
			V(offer3);
		}
		P(finish);
	}
}

void smoker_process_one()
{
	while(1)
	{
		P(offer3);
		//吸烟
		V(finish);
	}
}

void smoker_process_two()
{
	while(1)
	{
		P(offer2);
		//吸烟
		V(finish);
	}
}

void smoker_process_three()
{
	while(1)
	{
		P(offer1);
		//吸烟
		V(finish);
	}
}

源码实现:

#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#include <iostream>

using namespace std;

sem_t offer1;
sem_t offer2;
sem_t offer3;
sem_t finish;

int sequence;

void* supplier_process(void* arg)
{
    cout << "supplier_process" << endl;
    while(1)
    {
        srand(time(0));
        sequence = rand() % 3;
        if(sequence == 0)
        {
            sem_post(&offer1);
            cout << "供应商提供烟草和纸" << endl;
        }
        else if (sequence == 1)
        {
            sem_post(&offer2);
            cout << "供应商提供烟草和胶水" << endl;
        }
        else
        {
            sem_post(&offer3);
            cout << "供应商提供纸和胶水" << endl;
        }
        cout << "供应商正在等待抽烟者完成吸烟" << endl;
        sem_wait(&finish);
    }
}

void* smoker_process_one(void* arg)
{
    cout << "smoker_process_one" << endl;
    while(1)
    {
        sem_wait(&offer3);
        cout << "第一个吸烟者拥有烟草,拿着供应商给的纸和胶水,卷烟吸烟" << endl;
        sleep(1);
        sem_post(&finish);
    }
}

void* smoker_process_two(void* arg)
{
    cout << "smoker_process_two" << endl;
    while(1)
    {
        sem_wait(&offer2);
        cout << "第二个吸烟者拥有纸张,拿着供应商给的烟草和胶水,卷烟吸烟" << endl;
        sleep(1);
        sem_post(&finish);
    }
}

void* smoker_process_three(void* arg)
{
    cout << "smoker_process_three" << endl;
    while(1)
    {
        sem_wait(&offer1);
        cout << "第三个吸烟者拥有胶水,拿着供应商给的纸和烟草,卷烟吸烟" << endl;
        sleep(1);
        sem_post(&finish);
    }
}

int main()
{
    sem_init(&offer1, 0, 0);
    sem_init(&offer2, 0, 0);
    sem_init(&offer3, 0, 0);
    sem_init(&finish, 0, 0);

    pthread_t supple;
    pthread_t smoker[3];
    
    pthread_create(&supple, nullptr, supplier_process, nullptr);
    
    pthread_create(&smoker[0], nullptr, smoker_process_one, nullptr);
    pthread_create(&smoker[1], nullptr, smoker_process_two, nullptr);
    pthread_create(&smoker[2], nullptr, smoker_process_three, nullptr);

    pthread_join(supple,nullptr);
    pthread_join(smoker[0],nullptr);
    pthread_join(smoker[1],nullptr);
    pthread_join(smoker[2],nullptr);
    
    return 0;
}

供应商提供纸和胶水
供应商正在等待抽烟者完成吸烟
第一个吸烟者拥有烟草,拿着供应商给的纸和胶水,卷烟吸烟
供应商提供烟草和纸
供应商正在等待抽烟者完成吸烟
第三个吸烟者拥有胶水,拿着供应商给的纸和烟草,卷烟吸烟
供应商提供烟草和纸
供应商正在等待抽烟者完成吸烟
第三个吸烟者拥有胶水,拿着供应商给的纸和烟草,卷烟吸烟
供应商提供纸和胶水
供应商正在等待抽烟者完成吸烟
第一个吸烟者拥有烟草,拿着供应商给的纸和胶水,卷烟吸烟
供应商提供烟草和胶水
供应商正在等待抽烟者完成吸烟
第二个吸烟者拥有纸张,拿着供应商给的烟草和胶水,卷烟吸烟
供应商提供烟草和胶水
供应商正在等待抽烟者完成吸烟
第二个吸烟者拥有纸张,拿着供应商给的烟草和胶水,卷烟吸烟
供应商提供烟草和胶水
供应商正在等待抽烟者完成吸烟
第二个吸烟者拥有纸张,拿着供应商给的烟草和胶水,卷烟吸烟

本文链接: http://www.dtmao.cc/news_show_700124.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?