编程模拟多进程共享临界资源

本文描述了一个Linux系统中的课程设计项目,涉及用户进程与管理进程协作,管理进程控制临界区并发,遵循空闲让进等临界区准则。通过随机请求和访问临界资源,实现并发控制并确保正确运行。
摘要由CSDN通过智能技术生成

目录

题目要求:

代码实现:

运行结果展示:


题目要求:

本次课程设计要求将课内外掌握的相关基本内容体现在课程设计中,小组内相互配合找到解决问题的方法,具体设计要求如下:

(1)要求系统由两部分组成:用户进程与管理进程;

(2)管理进程要控制设计相应的临界区,并实现临界区的四大准则:空闲让进、忙则等待、有限等待、让权等待;

(3)要求用户进程的申请是随机且循环的;

(4)在消息队列中事先约定好进程写入的信息类型;

(5)用户进程在临界区执行的时间要是随机的,且执行完毕后要向管理进程发出申请退出的信号;

(6)要求最终实现的代码在linux系统中能成功运行并显示最终结果;

代码实现:

#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <ctime>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <thread>
#include <atomic>

// 临界资源
std::atomic<int> sharedResource(0);

// 请求队列和释放队列
std::queue<int> requestQueue;
std::queue<int> releaseQueue;

// 互斥锁和条件变量
std::mutex mtx;
std::condition_variable cv;

// 用户进程
void userProcess(int processId) {
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        std::cout << "进程" << processId << "请求进入临界区……" << std::endl;
        requestQueue.push(processId);
        cv.notify_one();
        cv.wait(lock, [processId] { return requestQueue.front() == processId; });
        std::cout << "进程" << processId << "已进入临界区" << std::endl;
        lock.unlock();

        // 访问临界资源
        int newValue = rand() % 100;
        std::cout << "进程" << processId << "正在访问临界资源,新值为:" << newValue << std::endl;
        sharedResource = newValue;

        std::this_thread::sleep_for(std::chrono::seconds(rand() % 5 + 1));

        lock.lock();
        std::cout << "进程" << processId << "退出临界区……" << std::endl;
        releaseQueue.push(processId);
        cv.notify_one();
        cv.wait(lock, [processId] { return releaseQueue.front() == processId; });
        std::cout << "进程" << processId << "已退出临界区" << std::endl;
        lock.unlock();
    }
}

// 管理进程
void managerProcess() {
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, [] { return !requestQueue.empty(); });
        int allowed = requestQueue.front();
        std::cout << "允许进程" << allowed << "进入临界区" << std::endl;
        requestQueue.pop();
        cv.notify_one();
        lock.unlock();

        lock.lock();
        cv.wait(lock, [] { return !releaseQueue.empty(); });
        releaseQueue.pop();
        cv.notify_one();
        lock.unlock();
    }
}

int main() {
    srand(time(0));

    std::thread user1(userProcess, 1);
    std::thread user2(userProcess, 2);
    std::thread manager(managerProcess);

    user1.join();
    user2.join();
    manager.join();

    return 0;
}

运行结果展示:

若需要完整课程设计报告,可评论区留言。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值