(1)阅览室问题:加入阅览室入口有一本登记册,每个人都必须按顺序签名进去。
struct { char name[10]; int number; }A[100]; semaphore mutex = 1; //控制A[]被修改的信号量 semaphore seatcount = 100; //剩余的座位数 int i; for(i=0; i<100; i++) { A[i].number=i; A[i].nume=null; } cobegin process readeri(char readername[]) { P(seatcount); P(mutex); for(int i=0; i<100; i++) { if(A[i].name==null) A[i].name=readername; reader get the seat number i; } V(mutex); {进入阅览室座位号i,坐下读书}; P(mutex); A[i].name = null; V(mutex); V(seatcount); } coend
semaphore mutex1 = mutex2 = mutex3 = mutex0 = 1; //约束每个信箱同一时间只能有一个进程操作 semaphore empty0 = 0 , empty1 = 3 , empty2 = empty3 =2; //信箱剩余空间 semaphore full0 = 3 , full1 = full2 = full3 =0; //信箱剩余信件数 int in0 = in1 = in2 = in3 = out0 = out1 = out2 = out3 =0; //信箱中存、取信的位置,初始均为0 cobegin process P0( ) { while(true) { P(full0); P(mutex0); {从M0[out0]取一条消息}; out0 = ( out0 + 1 ) % 3; V(mutex0); V(empty0); {加工消息}; P(empty1); P(mutex1); {消息存M1[in1]}; in1 = ( in1 + 1 ) % 3; V(mutex1); V(full1); } } /*P1-P3略*/ coend
semaphore waits = 0; Semaphore mutex = 1; int numbersum = 0; cobegin process readeri(int number) { P(mutex); while(numbersum+number>=M) { V(mutex); P(waits); } numbersum = numbersum + number; V(mutex); Read file; P(mutex); numbersum = numbersum - number; V(waits); V(mutex); } coend
semaphore s1 = 1; //可捡白子 semaphore s2 = 0; //可捡黑子 process p1() { while(true) { P(s1); 捡白子; V(s2); } } process p2() { while(true) { P(s2); 捡白子; V(s1); } }
Semaphore allow = -1; Semaphore mutex = 1; int count = count_black = count_black = 0; process A(){ while(true){ P(mutex); get(black); V(mutex); if(取到了){count_black++;} else break; } V(allow); } process B(){ while(true){ P(mutex); get(write); V(mutex); if(取到了){count_write++;} else break; } V(allow); } process C(){ P(allow); count = count_black + count_write; printf(); }
semaphore mutex , empty[n2] , full[n2]; int i; mutex = 1; for(i=1; i<n2; i++) { empty[i]=m; full[i]=0; } cobegin send() { for(int i=0;i<n2;i++) { P(empty[i]); P(mutex); {将消息放入缓冲区;} V(mutex); } for(int i=0;i<n2;i++){ V(full[i]); } } receive() { for(int i=0;i<n2;i++) { P(full[i]); P(mutex); {从缓冲区中取出信息;} V(mutex); } for(int i=0;i<n2;i++) { V(empty[i]); } } coend
int buf[9]; int count = getptr = putptr = 0; semaphore s1 = s2 = 1; Semaphore sput = 1; Semaphore sget = 0; cobegin process producer_i() { while(true) { P(sput); P(s1); buf[putptr] = 1; putptr = ( putptr + 1 ) % 9; buf[putptr] = 2; putptr = ( putptr + 1 ) % 9; buf[putptr] = 3; putptr = ( putptr + 1 ) % 9; V(sget); V(sget); V(sget); V(s1); } } process consumer_j() { int y; while(true) { P(sget); P(s2); y = buf[getptr]; getptr = ( getptr + 1 ) % 9; count++; if(count==3){ count = 0; V(sput); } V(s2); 消费整数y; } } coend
semaphore mutex1 = mutex2 = 1; semaphore s1 = N/5 , s2 = 4N/5 , s3 = s4 = 0; int count = 0; int in1 = in2 = out1 = out2 = 0; cobegin process worker1() { while(true) { 加工一个车架; P(s1); P(mutex1); 车架放入box[in1]; in1 = (in1 +1) % (N/5); V(mutex1); V(s3); } process worker2() { while(true) { 加工一个车轮; P(s2); P(mutex2); 车架放入box[in2]; in2 = (in2 +1) % (4N/5); count = count + 1; if(count==4) { count = 0; V(s4); } V(mutex2); } process worker3() { while(true) { P(s3); P(mutex1); 从box[out1]拿车架; out1 = (out1 + 1) % (N/5); V(mutex1); V(s1); P(s4); P(mutex2); 从box[out2]开始取四个车轮; out2 = (out2 + 4) % (4N/5); V(s2); V(mutex2); 装配车子; } } ceend
semaphore mutex=1; semaphore sx = M-1; semaphore sy = N-1; cobegin process storeX( ) { while(true) { P(sx); P(mutex); {将X产品入库}; V(mutex); V(sy); } } process storeY( ) { while(true) { P(sy); P(mutex); {将Y产品入库}; V(mutex); V(sx); } } coend
semaphore empty1 , empty2 , full1 , full2 , mutex , sa , sb; int in1 , in2 , out1 , out2; empty1 = empty2 = m; //剩余可放空间 full1 = full2 = 0; //剩余产品数 sa = sb = n; mutex = 1; in1 = in2 = out1 = out2 = 0; cobegin process put_A() { while(true) { P(empty1); P(sa); P(mutex); 把A零件放入buffA[in1]; in1 = (in1 + 1) % m; V(mutex); V(sb); V(full1); } } process put_B() { while(true) { P(empty2); P(sb); P(mutex); 把B零件放入buffB[in2]; in2 = (in2 + 1) % m; V(mutex); V(sa); V(full2); } } process get() { while(true) { P(full1); P(full2); P(mutex); 从buffA[out1]取A零件; 从buffB[out2]取B零件; out1 = (out1 + 1) % m; out2 = (out2 + 1) % m; V(mutex); V(empty1); V(empty2); 把A和B装配成产品; } } coend
Semaphore empty = 500; Semaphore mutex = 1; cobegin process_i(){ P(empty); P(mutex); 进门; V(mutex); 参观; P(mutex); 出门; V(mutex); V(empty); }
typedef struct{ float a; float b; }cnum; cnum x , y ,z; cnum add(cnum p ,cnum q){ cnum s; s.a = p.a + q.a; s.b = s.b + q.b; return s; }
Semaphore mutex_y1 = 1; //线程1、3对y的互斥访问 Semaphore mutex_y2 = 1; //线程2、3对y的互斥访问 Semaphore mutex_z = 1; //线程2、3对z的互斥访问 thread1{ cnum w; P(mutex_y1); w = add(x , y); V(mutex_y1); } thread2{ cnum w; P(mutex_y2); P(mutex_z); w = add(y , z); V(mutex_z); V(mutex_y2); } thread3{ cnum w; w.a = 1; w.b = 1; P(mutex_z); z = add(z , w); V(mutex_z); P(mutex_y1); P(mutex_y2) y = add(y , z); V(mutex_y1); V(mutex_y2); }
Semaphore mutex = 1; Sempahore full = 1; Semaphore empty = 100; process P(){ P(empty); P(mutex); read20(); V(mutex); V(full); } Process Q1(){ P(full); get20(); P(full); get20(); comp40t30(); V(empty); print15; V(empty); print15; }
原文:https://www.cnblogs.com/yangyuliufeng/p/10713095.html