1

私のコードはここにあります:http://pastebin.com/Fi3h0E0P

これが出力です

0
Should we take order today (y or n): y
Enter order number: 100
More customers (y or n): n

Stop serving customers right now. Passing orders to cooker:
There are total of 1 order(s)
1
Roger, waiter. I am processing order #100

目標は、ウェイターが注文を受けてから料理人に渡す必要があることです。ウェイターは、料理人がすべてのピザを完成させ、ピザを配達してから、新しい注文を受け取るのを待つ必要があります。

以前の投稿でPVがどのように機能するかをここで尋ねました。

\n私はそれが消費とは何の関係もないと思いますか?あらゆる種類の組み合わせを試しwait()ましたが、うまくいきませんでした。

どこで間違えたの?

主な部分はここにあります:

//Producer process
 if(pid > 0)
 {
    while(1)
    {
      printf("0");
      P(emptyShelf); // waiter as P finds no items on shelf;
      P(mutex); // has permission to use the shelf
      waiter_as_producer();
      V(mutex); // cooker now can use the shelf
      V(orderOnShelf); // cooker now can pickup orders

      wait();
      printf("2");
      P(pizzaOnShelf);
      P(mutex);
      waiter_as_consumer();
      V(mutex);
      V(emptyShelf);
      printf("3 ");
    }
 }
    if(pid == 0)
    {
     while(1)
    {
     printf("1");
     P(orderOnShelf); // make sure there is an order on shelf
     P(mutex); //permission to work
     cooker_as_consumer(); // take order and put pizza on shelf
     printf("return from cooker");
     V(mutex); //release permission
     printf("just released perm");
     V(pizzaOnShelf); // pizza is now on shelf
     printf("after");
     wait();
     printf("4");

    }
  }

したがって、これが実行パスであると想像します。waiter_as_producerと入力し、子プロセス(cooker)に移動してから、制御を親に戻し、waiter_as_consumerを終了し、子に切り替えます。2つの待機は親に戻ります(私がすべての可能なwait()の組み合わせを試したと言ったように...)。

4

1 に答える 1

2
  • に変更します#define PERMS (0)(これは8 進ファイル モード マスクではありません!)
  • wait();すべてのsを削除します
  • sizeof:if((shmid=shmget(1000,sizeof (int) * BUFSIZE,IPC_CREAT | PERMS)) < 0)などによるサイズのスケーリング (サイズは semsize/pagesize を法として拡大されますが、いずれにせよ適切なサイズを使用することをお勧めします)

ここで問題を修正しました。

全体のアイデアは次のとおりです。待つ必要はありません。{producer,consumer} の 1 つが P() のどこかでブロックされます。

P() から:

sb.sem_flg = 0; /* blocking call */
    if (semop(sid, &sb, 1) == -1)
        perror("semop");

さらに、wait(&status)少なくとも引数が必要です。(そしておそらく、 wait3() や waitpid() などの他の待機関数のいずれかが必要になるでしょう)

その他:

  • 共有オブジェクトの宣言の前に「volatile」を置きます。volatile int *buff;
  • main() は int を返す必要があり、値なしで返すのは間違っています (c99 より前)
  • ほとんどのポインター操作は不器用です:order = buffer[i];と同じですorder = *(buffer+i);が、より読みやすくなっています。
于 2012-11-14T22:25:02.127 に答える