一、实验名称:进程同步
二、实验目的与要求
1. 通过本次实验,使学生了解进程同步和互斥的实现方法,加深对进程同步和互斥概念的理解。
三、实验内容
(一)售票员和司机合作问题
问题描述:设公共汽车上,司机和售票员的活动分别是:
司机的活动: 启动车辆;
正常行车;
到站停车;
售票员的活动:关车门;
售票;
开车门;
编写程序实现这两个活动的同步关系。
源代码为:
#include <iostream>
#include <thread>
#include <vector>
#include <queue>
#include <ctime>
#include <mutex>
#include <windows.h>
#include <condition_variable>
using namespace std;
class Semaphore{
private:
mutex mut;
condition_variable condition;
int count;
public:
Semaphore(int count=0) : count(count) {};
//P操作
void P(){
unique_lock<mutex> unique(mut);
--count;
if(count<0)
condition.wait(unique);
}
//V操作
void V(){
unique_lock<mutex> unique(mut);
++count;
if(count<=0)
condition.notify_one();
}
};
Semaphore s1(0);//同步信号量S1表示是否允许驾驶员启动汽车
Semaphore s2(0); //同步信号量S2表示是否允许售票员开门
void drive()
{
while(true)
{
s1.P();
cout<<"汽车行驶中…."<<endl;
Sleep(1);
s2.V();
}
}
void conductor()
{
while(true)
{
cout<<"关车门!"<<endl;
s1.V();
cout<<"现在开始售票…."<<endl;
Sleep(1);
s2.P();
cout<<"汽车到站,打开车门,乘客上下车。"<<endl;
}
}
int main() {
thread p1(drive),p2(conductor);
p1.join();
p2.join();
return 0;
}
执行结果为:
(二)进步同步关系问题:现有5个操作A、B、C、D、E,操作C必须在操作A和B完成后执行,操作E必须在操作C和D完成后执行,请编程实现5者之间的同步关系。
源代码为:
#include <iostream>
#include <thread>
#include <vector>
#include <queue>
#include <ctime>
#include <mutex>
#include <windows.h>
#include <condition_variable>
using namespace std;
class Semaphore{
private:
mutex mut;
condition_variable condition;
int count;
public:
Semaphore(int count=0) : count(count){};
//P操作
void P(string x){
unique_lock<mutex> unique(mut);
--count;
if(count<0)
{
condition.wait(unique);
cout<<x<<"等待执行…."<<endl;
}
}
//V操作
void V(){
unique_lock<mutex> unique(mut);
++count;
if(count<=0)
condition.notify_one();
}
};
Semaphore Sa(0),Sb(0),Sc(0),Sd(0);//信号量定义
void process_p1()
{
while(1)
{
cout<<"A正在执行"<<endl;
Sa.V();
}
}
void process_p2()
{
while(1)
{
cout<<"B正在执行"<<endl;
Sb.V();
}
}
void process_p3()
{
while(1)
{
Sa.P("A");
Sb.P("B");
cout<<"C正在执行"<<endl;
Sc.V();
}
}
void process_p4()
{
while(1)
{
cout<<"D正在执行"<<endl;
Sd.V();
}
}
void process_p5()
{
while(1)
{
Sc.P("C");
Sd.P("D");
cout<<"E正在执行"<<endl;
}
}
int main() {
thread p1(process_p1),p2(process_p2),p3(process_p3),p4(process_p4),p5(process_p5);
p1.join();
p2.join();
p3.join();
p4.join();
p5.join();
return 0;
}
执行结果为:
(三)展览馆问题:某展览馆矩形现代画展,展览馆内可以同时接纳2000人参观,参观者的票分为学生票和普通票,要求:
1)0≤(普通票-学生票)≤400
2)展览馆出入口每次只能有1人进出。
请编程实现进程之间的关系。
源代码为:
#include <iostream>
#include <thread>
#include <vector>
#include <queue>
#include <ctime>
#include <mutex>
#include <windows.h>
#include <condition_variable>
using namespace std;
class Semaphore{
private:
mutex mut;
condition_variable condition;
int count;
public:
Semaphore(int count=0) : count(count){};
//P操作
void P(){
unique_lock<mutex> unique(mut);
--count;
if(count<0)
{
condition.wait(unique);
}
}
//V操作
void V(){
unique_lock<mutex> unique(mut);
++count;
if(count<=0)
condition.notify_one();
}
};
Semaphore t1(400);//普通票初值
Semaphore t2(0);//学生票初值
Semaphore empty(2000),m(1);
void Common()
{
while(1)
{
empty.P();
t1.P();
m.P();
cout<<"普通人进馆"<<endl;
m.V();
Sleep(3);
m.P();
cout<<"普通人出馆"<<endl;
m.V();
t2.V();
empty.V();
}
}
void Student()
{
while(1)
{
empty.P();
t2.P();
m.P();
cout<<"学生进馆"<<endl;
m.V();
Sleep(3);
m.P();
cout<<"学生出馆"<<endl;
m.V();
t1.V();
empty.V();
}
}
int main() {
thread common(Common),student(Student);
common.join();
student.join();
return 0;
}
执行结果为: