第三章 同步、通信与死锁_2.pptVIP

  • 11
  • 0
  • 约5.38千字
  • 约 21页
  • 2017-02-01 发布于湖北
  • 举报
举例 3.3.4信号量解决五个哲学家吃通心面问题 3.3.5信号量解决生产者-消费者问题 3.3.6记录型信号量解决读者-写者问题 3.3.7记录型信号量解决理发师问题 有五个哲学家围坐在一圆桌旁,桌中央有一盘通心面,每人面前有一只空盘于,每两人之间放一把叉子。每个哲学家思考、饥饿、然后吃通心面。为了吃面,每个哲学家必须获得两把叉子,且每人只能直接从自己左边或右边去取叉子 semaphore fork[5]; for (int i=0;i5;i++) fork[i]=1; cobegin process philosopher_i( ) { //i= 0,1,2,3,4 while(true) { think( ); P(fork[i]); P(fork[(i+1)%5]); eat( ); V(fork[i]); V(fork[(i+1)%5]); } } coend 上述解法可能出现永远等待,有若 干种办法可避免死锁: ?至多允许四个哲学家同时吃; ?奇数号先取左手边的叉子,偶数号先取右手边的叉子; ?每个哲学家取到手边的两把叉子才吃,否则一把叉子也不取。 semaphore fork[5]; for (int i=0;i5;i++) fork[i]= 1; cobegin process philosopher_i( ){/*i=0,1,2,3 */ while(true) { think( ); P(fork[i]; /*i=4,P(fork[0])*/ P(fork[(i+1)%5] );/*i=4,P(fork[4])*/ eat( ); V(fork[i]); V(fork([i+ 1] % 5); } } coend ①一个生产者、一个消费者共享一个缓冲区 ②多个生产者、多个消费者共享多个缓冲区 int B; semaphore empty; //可以使用的空缓冲区数 semaphore full; //缓冲区内可以使用的产品数 empty=1; //缓冲区内允许放入一件产品 full=0; //缓冲区内没有产品 cobegin process producer(){ process consumer(){ while(true){ while(true) { produce( ); P(full); P(empty); take( ) from B; append( ) to B; V(empty); V(full); consume( ); } } } } coend item B[k]; semaphore empty; empty=k; //可以使用的空缓冲区数 semaphore full; full=0; //缓冲区内可以使用的产品数 semaphore mutex; mutex=1; //互斥信号量 int in=0; //放入缓冲区指针 int out=0; //取出缓冲区指针? cobegin process producer_i ( ){ process consumer_j ( ){ while(true) { while(true) { produce( ); P(full); P(empty); P(mutex); P(mutex); take( ) from B[out]; append to B[in]; out=(out+1)%k; in=(in+1)%k; V(mutex); V(mutex); V(empty);

文档评论(0)

1亿VIP精品文档

相关文档