操作系统实验之进程管理实验报告
操作系统实验报告进程管理

操作系统实验报告进程管理操作系统实验报告:进程管理引言操作系统是计算机系统中的核心软件,负责管理计算机的硬件资源和提供用户与计算机之间的接口。
进程管理是操作系统的重要功能之一,它负责对计算机中运行的各个进程进行管理和调度,以保证系统的高效运行。
本实验报告将介绍进程管理的基本概念、原理和实验结果。
一、进程管理的基本概念1. 进程与线程进程是计算机中正在运行的程序的实例,它拥有独立的内存空间和执行环境。
线程是进程中的一个执行单元,多个线程可以共享同一个进程的资源。
进程和线程是操作系统中最基本的执行单位。
2. 进程状态进程在运行过程中会经历不同的状态,常见的进程状态包括就绪、运行和阻塞。
就绪状态表示进程已经准备好执行,但还没有得到处理器的分配;运行状态表示进程正在执行;阻塞状态表示进程由于某些原因无法继续执行,需要等待某些事件的发生。
3. 进程调度进程调度是操作系统中的一个重要任务,它决定了哪个进程应该获得处理器的使用权。
常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转等。
二、进程管理的原理1. 进程控制块(PCB)PCB是操作系统中用于管理进程的数据结构,它包含了进程的各种属性和状态信息,如进程标识符、程序计数器、寄存器值等。
通过PCB,操作系统可以对进程进行管理和控制。
2. 进程创建与撤销进程的创建是指操作系统根据用户的请求创建一个新的进程。
进程的撤销是指操作系统根据某种条件或用户的请求终止一个正在运行的进程。
进程的创建和撤销是操作系统中的基本操作之一。
3. 进程同步与通信多个进程之间可能需要进行同步和通信,以实现数据共享和协作。
常见的进程同步与通信机制包括互斥锁、信号量和管道等。
三、实验结果与分析在本次实验中,我们使用了一个简单的进程管理模拟程序,模拟了进程的创建、撤销和调度过程。
通过该程序,我们可以观察到不同调度算法对系统性能的影响。
实验结果显示,先来先服务(FCFS)调度算法在一些情况下可能导致长作业等待时间过长,影响系统的响应速度。
操作系统实验二:进程管理

操作系统实验二:进程管理操作系统实验二:进程管理篇一:操作系统实验报告实验一进程管理一、目的进程调度是处理机管理的核心内容。
本实验要求编写和调试一个简单的进程调度程序。
通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。
二、实验内容及要求1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。
可根据实验的不同,PCB结构的内容可以作适当的增删)。
为了便于处理,程序中的某进程运行时间以时间片为单位计算。
各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
2、系统资源(r1…rw),共有w类,每类数目为r1…rw。
随机产生n进程Pi(id,s(j,k)t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。
3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。
建立进程就绪队列。
4、编制进程调度算法:时间片轮转调度算法本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。
在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。
三、实验环境操作系统环境:Windows系统。
编程语言:C#。
四、实验思路和设计1、程序流程图2、主要程序代码//PCB结构体struct pcb{public int id; //进程IDpublic int ra; //所需资源A的数量public int rb; //所需资源B的数量public int rc; //所需资源C的数量public int ntime; //所需的时间片个数public int rtime; //已经运行的时间片个数public char state; //进程状态,W(等待)、R(运行)、B(阻塞)//public int next;}ArrayList hready = new ArrayList();ArrayList hblock = new ArrayList();Random random = new Random();//ArrayList p = new ArrayList();int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数//r为可随机产生的进程数(r=m-n)//a,b,c分别为A,B,C三类资源的总量//i为进城计数,i=1…n//h为运行的时间片次数,time1Inteval为时间片大小(毫秒)//对进程进行初始化,建立就绪数组、阻塞数组。
操作系统进程控制实验报告

操作系统进程控制实验报告一、实验目的操作系统进程控制是操作系统中的重要概念和核心功能之一。
本次实验的目的在于深入理解操作系统中进程的概念、状态及其转换,掌握进程创建、终止、阻塞和唤醒等操作的实现原理和方法,通过实际编程和调试,观察进程的行为和特性,从而提高对操作系统原理的理解和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。
三、实验原理(一)进程的概念进程是操作系统中进行资源分配和调度的基本单位,它包含了程序代码、数据、堆栈等资源。
进程具有独立性、动态性和并发性等特点。
(二)进程的状态进程的状态通常包括就绪态、运行态和阻塞态。
就绪态表示进程已具备运行条件,等待被调度;运行态表示进程正在 CPU 上执行;阻塞态表示进程因等待某个事件而暂停执行。
(三)进程控制的基本操作1、进程创建:通过系统调用创建新的进程,为其分配资源并初始化。
2、进程终止:当进程完成任务或出现异常时,结束其执行并回收资源。
3、进程阻塞:进程在等待某个事件时,主动进入阻塞态。
4、进程唤醒:当等待的事件发生时,将阻塞的进程唤醒,使其进入就绪态。
四、实验内容与步骤(一)进程创建1、编写 C++程序,使用系统提供的函数创建新的进程。
2、在新进程中执行特定的任务,例如打印输出信息。
```cppinclude <windowsh>include <iostream>int main(){STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));sicb = sizeof(si);ZeroMemory(&pi, sizeof(pi));//创建新进程if (!CreateProcess(NULL, //应用程序名称"C:\\Path\\To\\Your\\ChildProcessexe",//命令行参数NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){std::cerr <<"CreateProcess failed Error code: "<<GetLastError()<< std::endl;return 1;}//等待子进程结束WaitForSingleObject(pihProcess, INFINITE);//关闭进程和线程句柄CloseHandle(pihProcess);CloseHandle(pihThread);return 0;}```(二)进程终止1、在创建的进程中设置条件,当满足条件时主动终止进程。
电大操作系统实验报告3_ 进程管理实验

电大操作系统实验报告3_ 进程管理实验电大操作系统实验报告 3 进程管理实验一、实验目的进程管理是操作系统的核心功能之一,本次实验的目的是通过实际操作和观察,深入理解进程的概念、状态转换、进程调度以及进程间的通信机制,掌握操作系统中进程管理的基本原理和方法,提高对操作系统的整体认识和实践能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C 语言,开发工具为 Visual Studio 2019。
三、实验内容及步骤(一)进程的创建与终止1、编写一个 C 程序,使用系统调用创建一个子进程。
2、在父进程和子进程中分别输出各自的进程 ID 和父进程 ID。
3、子进程执行一段简单的计算任务,父进程等待子进程结束后输出结束信息。
以下是实现上述功能的 C 程序代码:```cinclude <stdioh>include <stdlibh>include <unistdh>int main(){pid_t pid;pid = fork();if (pid < 0) {printf("创建子进程失败\n");return 1;} else if (pid == 0) {printf("子进程:我的进程 ID 是%d,父进程 ID 是%d\n",getpid(), getppid());int result = 2 + 3;printf("子进程计算结果:2 + 3 =%d\n", result);exit(0);} else {printf("父进程:我的进程 ID 是%d,子进程 ID 是%d\n",getpid(), pid);wait(NULL);printf("子进程已结束\n");}return 0;}```编译并运行上述程序,可以观察到父进程和子进程的输出信息,验证了进程的创建和终止过程。
(二)进程的状态转换1、编写一个 C 程序,创建一个子进程,子进程进入睡眠状态一段时间,然后被唤醒并输出状态转换信息。
进程管理演示实验报告

一、实验目的1. 理解进程的概念及其在操作系统中的作用。
2. 掌握Linux系统中进程的创建、调度、同步和通信方法。
3. 熟悉进程的阻塞、挂起、恢复和终止操作。
4. 学习使用相关命令和工具进行进程管理和调试。
二、实验环境操作系统:Linux开发环境:GCC、Xshell三、实验内容1. 进程创建与调度2. 进程同步与通信3. 进程阻塞与恢复4. 进程终止与调试四、实验步骤1. 进程创建与调度(1)编写一个简单的C程序,使用fork()函数创建一个子进程。
(2)在父进程中,使用getpid()和getppid()函数获取进程ID和父进程ID。
(3)使用ps命令查看当前系统中的进程,观察父进程和子进程的状态。
(4)使用waitpid()函数等待子进程结束。
2. 进程同步与通信(1)编写一个使用管道(pipe)进行进程间通信的C程序。
(2)父进程向管道中写入数据,子进程从管道中读取数据。
(3)使用ps命令查看进程状态,观察管道通信的效果。
(4)编写一个使用信号量(semaphore)进行进程同步的C程序。
(5)使用sem_wait()和sem_post()函数实现进程同步。
3. 进程阻塞与恢复(1)编写一个使用sleep()函数使进程阻塞的C程序。
(2)在父进程中,使用waitpid()函数等待阻塞的子进程结束。
(3)使用kill()函数向阻塞的进程发送SIGCONT信号,使其恢复执行。
4. 进程终止与调试(1)编写一个使用exit()函数终止进程的C程序。
(2)在父进程中,使用waitpid()函数等待终止的子进程。
(3)使用gdb调试器分析程序运行过程中出现的问题。
五、实验结果与分析1. 进程创建与调度实验结果表明,使用fork()函数成功创建了子进程,父进程和子进程的进程ID和父进程ID被正确获取。
通过ps命令,可以观察到父进程和子进程的状态。
2. 进程同步与通信实验结果表明,管道通信可以成功实现父进程和子进程之间的数据传递。
进程管理实验报告源代码(3篇)

第1篇---进程管理实验报告一、实验目的1. 理解进程的概念和进程管理的基本原理。
2. 掌握进程的创建、调度、同步和通信等操作。
3. 通过编程实现简单的进程管理功能。
二、实验环境1. 操作系统:Windows/Linux2. 编程语言:C/C++3. 开发环境:Visual Studio/Code::Blocks三、实验内容1. 进程的创建与终止2. 进程的同步与互斥3. 进程的通信4. 进程调度算法四、实验步骤1. 进程的创建与终止```cinclude <stdio.h>include <sys/types.h>include <unistd.h>int main() {pid_t pid;// 创建子进程pid = fork();if (pid < 0) {// 创建进程失败perror("fork failed");return 1;} else if (pid == 0) {// 子进程printf("Child process, PID: %d\n", getpid()); // 执行子进程的任务...sleep(5); // 子进程暂停5秒_exit(0); // 子进程退出} else {// 父进程printf("Parent process, PID: %d\n", getpid()); wait(NULL); // 等待子进程结束printf("Child process has terminated.\n");}return 0;}```2. 进程的同步与互斥```cinclude <stdio.h>include <pthread.h>pthread_mutex_t mutex;void thread_func(void arg) {pthread_mutex_lock(&mutex); // 加锁printf("Thread %ld is running\n", (long)arg);sleep(1); // 模拟任务执行pthread_mutex_unlock(&mutex); // 解锁return NULL;}int main() {pthread_t thread1, thread2;// 初始化互斥锁pthread_mutex_init(&mutex, NULL);// 创建线程pthread_create(&thread1, NULL, thread_func, (void )1); pthread_create(&thread2, NULL, thread_func, (void )2); // 等待线程结束pthread_join(thread1, NULL);pthread_join(thread2, NULL);// 销毁互斥锁pthread_mutex_destroy(&mutex);return 0;}```3. 进程的通信```cinclude <stdio.h>include <stdlib.h>include <sys/ipc.h>include <sys/shm.h>int main() {key_t key;int shmid;int data;// 生成共享内存标识符key = ftok("shmfile", 65);// 创建共享内存段shmid = shmget(key, sizeof(int), 0666 | IPC_CREAT); if (shmid == -1) {perror("shmget failed");exit(1);}// 连接到共享内存段data = (int )shmat(shmid, (void )0, 0);if (data == (int )(-1)) {perror("shmat failed");exit(1);}// 使用共享内存data = 100;printf("Data in shared memory: %d\n", data); // 分离共享内存段if (shmdt(data) == -1) {perror("shmdt failed");exit(1);}// 删除共享内存段if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl failed");exit(1);}return 0;}```4. 进程调度算法```cinclude <stdio.h>include <stdlib.h>include <sys/time.h>typedef struct {int pid;int arrival_time;int burst_time;int waiting_time;int turnaround_time;} Process;int main() {Process processes[] = {{1, 0, 5, 0, 0},{2, 1, 3, 0, 0},{3, 4, 8, 0, 0}};int n = sizeof(processes) / sizeof(processes[0]);// 计算等待时间和周转时间int total_waiting_time = 0, total_turnaround_time = 0;for (int i = 0; i < n; i++) {if (i == 0) {processes[i].waiting_time = 0;} else {processes[i].waiting_time = processes[i - 1].turnaround_time;}processes[i].turnaround_time = processes[i].burst_time + processes[i].waiting_time;total_waiting_time += processes[i].waiting_time;total_turnaround_time += processes[i].turnaround_time;}printf("Average Waiting Time: %f\n", (float)total_waiting_time / n);printf("Average Turnaround Time: %f\n", (float)total_turnaround_time / n);return 0;}```五、实验结果与分析(此处应填写实验结果,包括运行程序输出、图表等,以及对实验结果的分析。
操作系统-进程管理实验报告

操作系统-进程管理实验报告实验一进程管理1.实验目的:(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)分析进程争用资源的现象,研究解决进程互斥的方法;(4)了解Linux系统中进程通信的基本原理。
2.实验预备内容(1)阅读Linux的sched.h源码文件,加深对进程管理概念的理解;(2)阅读Linux的fork()源码文件,分析进程的创建过程。
3.实验内容(1)进程的创建:编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。
试观察记录屏幕上的显示结果,并分析原因。
源代码如下:#include<XXX>#include<XXX>#include<unistd.h>#include <XXX>#include <XXX>int main(int argc,char* argv[]){pid_t pid1,pid2;pid1 = fork();if(pid1<0){fprintf(stderr,"childprocess1 failed");exit(-1);}else if(pid1 == 0){printf("b\n");}else{pid2 = fork();if(pid2<0){fprintf(stderr,"childprocess1 failed"); exit(-1);}else if(pid2 == 0){printf("c\n");}else{printf("a\n");sleep(2);exit(0);}}return 0;}结果如下:分析原因:pid=fork();操纵体系创建一个新的历程(子历程),而且在历程表中相应为它建立一个新的表项。
进程管理实验报告_共10篇 .doc

★进程管理实验报告_共10篇范文一:_进程管理实验报告进程管理实验报告一、进程与线程1.实验目的:1.通过本实验学习Linux中创建进程的方法。
2.学习系统调用fork的使用方法。
3.学习系统调用exec族调用的使用方法。
2.实验准备1.进程的创建创建一个进程的系统调用很简单,只要调用fork函数就可以了。
#includepid_tfork();当一个进程调用了fork以后,系统会创建一个子进程,这个子进程和父进程是不同的地方只有它的进程ID和父进程ID,其他的都一样,就像父进程克隆(clone)自己一样,当然创建两个一模一样的进程是没有意义的,为了区分父进程和子进程,我们必须跟踪fork调用返回值。
当fork调用失败的时候(内存不足或者是用户的最大进程数已到)fork返回—1,否则fork的返回值有重要的作用。
对于父进程fork返回子进程ID,而对于fork 子进程返回0,我们就是根据这个返回值来区分父子进程的。
2.关于fork的说明使用该函数时,该函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。
将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数可以是一个子进程获得其所有子进程的进程ID。
而fork函数使子进程得到的返回值是0的理由是:一个子进程只会有一个父进程,所以子进程总是可以调用函数getpid获得其父进程的进程ID。
3.系统调用exec族调用的说明父进程创建子进程后,子进程一般要执行不同的程序。
为了调用系统程序,我们可以使用系统调用exec族调用。
Exec族调用有以下五个函数:intexecl(constchar*path,constchar*arg,?);intexeclp(constchar*file,constchar*arg,?);intexecle(constchar*path,constchar*arg,?);intexecv(constchar*path,constchar*argv[]);intexecvp(constchar*file,constchar*argv[]);exec族调用可以执行给定程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
b[(i % 5 + 1) % 5] = philosopher[(i % 5 + 1) % 5].eat(); if (!b[(i % 5 + 4) % 5])
b[(i % 5 + 4) % 5] = philosopher[(i % 5 + 4) % 5].eat();
六、自我评价与总结
本次操作系统实验是模拟进程管理过程,解决哲学家的就餐问题。个人本 次实验还比较顺利,使用了比较熟悉的 c++语言进行算法的编写,比较巧妙的 定义了两个类来定义哲学家和筷子对象的属性以及相应的动作,方便在各种就 餐过程中对筷子的资源进行申请和释放,以及哲学家实现相应的动作。另一个 觉得比较好的地方是解决了死锁问题,通过判断当前哲学家是否可以同时拿起 左右筷子来避免死锁。
left.putdown(); right.putdown(); cout << "The philosopher " << Phi_num << " is thinking." << endl; sleep(1); } void finish() { sleep(1); cout << "The philosopher " << Phi_num << " has finished eating." << endl; think(); } };
}; bool b[5]; int i, j; srand(time(0)); j = rand() % 5; for (i = j; i < j + 5; i++) {
b[i % 5] = philosopher[i % 5].eat(); cout << endl << "********************************************************" << endl; } for (i = j; i < j + 5; i++) { if (b[i % 5]) {
①至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以进餐,
最终总会释放出他所用过的两只筷子,从而可使更多的哲学家进餐;
②仅当左右两只筷子均可用时,才允许哲学家拿起筷子就餐;
③规定奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲
学家则相反。
本实验中采取方法 2.
三、数据结构及功能设计
//放下筷子 void putdown() {
available = true; } };
//Philosopher 类
class Philosopher { private:
ChopStick &left, &right; int Phi_num; public: Philosopher(int num, ChopStick &c1, ChopStick &c2): left(c1), right(c2) {
学生学号
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称
计算机操作系统
开 课 学 院 计算机科学与技术学院
指导老师姓名
学生姓名
学生专业班级
2016 — 2017 学年 第一学期
实验二 进程管理
一、设计目的、功能与要求
1、实验目的
掌握进程管理的相关内容,对进程的同步和互斥,及信号量机制有深入的 理解。
2、功能设计
通过 philosopher 类定义五个哲学家对象,通过 Chopstick 类定义五只筷
子对象。生成一个 0-4 的随机数,对应首先开始就餐的哲学家。该哲学家开始
就餐,拿起左右手筷子,然后顺时针或者逆时针对其他四个哲学家依次进行吃
饭动作,吃饭之前判断是否可以拿起筷子,不能拿起则进行等待,若拿起了一
int id; bool available; //是否可以拿起筷子 public: ChopStick(int i = 0) {
id = i; available = true; } //拿起筷子 bool takeup() { while (!available)
return false; available = false; return true; }
1、数据结构
定义筷子类 Chopstick 和哲学家类 Philosopher,Chopstick 中包含筷子编
号 id,筷子的状态 available(表示筷子是否可用)。包含 takeup 拿起筷子函
数和 putdown 放下筷子函数,相当于申请筷子资源和释放筷子资源。
Philosopher 类中包含哲学家左右手的两只筷子 left、right 以及哲学家的
不足之处为,在本次实验中没有使用多线程的方法,与同学讨论发现使用 c++中多线程操作可以节约很多代码和空间,算法实现简单。而且其中带有了 p 操作和 v 操作不用自己重新定义。提高了代码的可读性。
本次实验通过解决哲学家就餐问题算法实现,对这进程管理的理解更加深 刻了,也通过实验结果的比较,掌握了死锁问题的解决方法。通过这样一个一 个小实验,也一定程度上锻炼了我的编程能力。
五、测试用例及运行结果、分析
测试结果截图:
分析:产生了一个随机数 0,并依次加 1 对每个哲学家进行分析。分析时首先看 左筷子是否可用,然后看右筷子,若有一个不可用则放下手中的另一只筷子,并 说明 need waiting。然后再下一时间段对每个哲学家再次分析,直到每个哲学 家都吃上饭,程序结束。 通过实验结果可得,程序正确运行,且解决了死锁问题。
Phi_num = num; } bool eat() {
bool br, bl; bl = left.takeup(); if (!bl) {
cout << "The Philosopher " << Phi_num << " is waiting the left chopstick." << endl;
} else {
b[i % 5] = philosopher[i % 5].eat(); if (b[i % 5])
continue; else
cout << "The philosopher " << i % 5 << "need waiting" << endl; } cout << endl << "********************************************************" << endl; } return 0; }
①只有拿到两只筷子时,哲学家才能吃饭; ②如果筷子已经在他人手上,则该哲学家必须等到他人吃完之后才能拿到 筷子; ③任何一个哲学家在自己没有拿到两只筷子吃饭之前,决不放下自己手中 的筷子。 (3)可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样 就可能五个哲学家都用不上餐。 (4)死锁解决方案:
编号 Phi_num。包含 eat 就餐动作,think 思考动作,finish 完成就餐三种动
作。在 eat 动作中通过判断是否左右手的筷子可以同时拿起来避免程序出现死
锁问题,若可以同时拿起,进行 eat 动作,否则将另一只手中的筷子放下。
//Chopstick 类
class ChopStick { private:
{ Philosopher(0, chopstick[4], chopstick[0]), Philosopher(1, chopstick[0], chopstick[1]), Philosopher(2, chopstick[1], chopstick[2]), Philosopher(3, chopstick[2], chopstick[3]), Philosopher(4, chopstick[3], chopstick[4])
2、实现功能
模拟实现用信号量机制解决经典同步问题
3、具体要求
任选一种计算机高级语言编程实现; 实现 5 个哲学家(5 只筷子)的顺利就餐 需要避免出现死锁 使用信号量、及信号量的等待队列 使用 p 操作、v 操作
二、问题描述
(1)有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空 盘子,每两人之间放一只筷子,即共 5 只筷子。每个哲学家的行为是思考和进 餐。为了进餐,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的 左边或右边去取筷子。思考时则同时将两支筷子放回原处。 (2)规则:
只筷子但另一只筷子不能拿起,需要放下另一只手中的筷子继续等待。程序直
到所有哲学家都完成就餐才结束。
四、开发工具及主要源代码
1、开发工具
SublimeText 3 文本编辑器,采用 g++编译。
2、主要源码
//主函数
int main() {
ChopStick chopstick[5] = {
ChopStick(0k(3), ChopStick(4), }; Philosopher philosopher[5] =
sleep(1); return false; } br = right.takeup(); if (!br) { cout << "The Philosopher " << Phi_num << " is waiting the right chopstick." << endl; //右筷子不能拿起时放下左筷子 left.putdown(); sleep(1); return false; } cout << "The philosopher " << Phi_num << " is having dinner." << endl; sleep(1); return true; } void think() {