作業系統 PV大作業

2022-06-23 16:39:34 字數 1679 閱讀 4913

題目描述:

現有一個小巷,除安全島可容2人暫時停身外,僅能容一人通過。a,b兩頭都允許行人進出,試用訊號量和pv操作設計一個演算法,讓兩頭的行人順利通過小巷。

解題模型:

sem_t a_s;//

a-s路段

sem_t b_s;//

b-s路段

sem_t island;//

島 sem_t a;//

對a頭的人數進行唯一操作

sem_t b;//

對b頭人數進行唯一操作

sem_t is;//

對island島上的人進行唯一操作

void*a()

v(a);

//a-people操作完成,解鎖

v(a-s); //

釋放 a-s路段 資源

p(b-s); //

請求踏上 b-s路段 ,上鎖

v(island); //

當a過來的人踏上 b-s路段,則釋放island資源,保證資源最大化

;v(b-s); //

解鎖 } }

void*b()

v(b);

//b-people操作完成,解鎖

v(b-s);//

釋放 b-s路段 資源

p(a-s);//

請求踏上 a-s路段 ,上鎖

v(island); //

當b過來的人踏上 a-s路段,則釋放island資源,保證資源最大化

;v(a-s); //

解鎖 }

}

程式原始碼:

#include #include 

#include

#include

#include

#include

#define p sem_wait

#define v sem_post

#define a_s &a_s_road

#define b_s &b_s_road

#define island &ab_island

#define a &a_peo

#define b &b_peo sem_t a_s_road;

//臨界資源:a-s路段

sem_t b_s_road;//

臨界資源:b-s路段

sem_t ab_island;//

島 初值為2

sem_t a_peo;//

對a頭的人數進行唯一操作

sem_t b_peo;//

對b頭人數進行唯一操作

int a_people=5;//

a頭的人數

int b_people=5;//

b頭的人數

int island_people=0;//

記錄島上的人數

void* process_a(void *p)

}void* process_b(void *p)

}int

main()