目录
题目要求:
本次课程设计要求将课内外掌握的相关基本内容体现在课程设计中,小组内相互配合找到解决问题的方法,具体设计要求如下:
(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;
}
运行结果展示:
若需要完整课程设计报告,可评论区留言。