2016-12-17 5 views
0

私はCでセマフォーを使って練習しています。クラスノートからサンプルを複製しようとするばかげたプログラムを書きました。次のコード(gcc -o ex3 ex3.c -lpthread)をコンパイルし、それを実行すると(./ex3)何も起こりません。Cでセマフォーを使ってダミープログラムを実装する

#include <semaphore.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

sem_t S1; 
sem_t S2; 
sem_t S3; 

int main(){ 

    int fa=4; 
    int fb=2; 
    int sum=0; 

    sem_init(&S1, 0, 1); 
    sem_init(&S2, 0, 0); 
    sem_init(&S3, 0, 0); 

    /* Proceso A*/ 
    while (fa<4) 
    { 
     sem_wait(&S1); 
     sum = sum + 2; 
     sem_post(&S2); 
     fa++; 
    } 

    /* Proceso B*/ 
    while (fb<2) 
    { 
     sem_wait(&S2); 
     sem_wait(&S2); 
     sum = sum + 3; 
     sem_post(&S3); 
     fb++; 
    } 

    /* Proceso C*/ 
    while (1) 
    { /* Imprimir */ 
     sem_wait(&S3); 
     printf("%d,", sum); 
     sem_post(&S1); 
     sem_post(&S1); 
     if (fa>4 && fb>2) 
      exit(0); 
    } 

    return 0; 
} 

私のアイデアは、これらのセマフォが何をするのかを少し良く理解するために、プロセスAとBに待機信号を追加することです。しかし前に、私は結果を見る必要があります:D

助けていただければ幸いです。

答えて

1

私のアイデアは、これらのセマフォが何をするかを少し良く理解するために、プロセスAとBに待機と信号を追加することです。しかし、前に、私は結果を見る必要があります:D

小さなプログラムには1つのプロセスしかありませんので、この演習を行うセマフォーを理解することは本当に難しいです。

確かに、それは常に最初とwhileループのために偽の式の第二スキップし、それを0に初期化され、変更されることはありませんので、それは

sem_wait(&S3); 

に貼り付けます。だからこの時点で永遠に待つでしょう。

私はそれが最初の二つのループ内のものを行いますように

int fa=0; 
int fb=0; 

の初期化をお勧めします。また、while(1)の最後のループを終了する機能を持たせるには、ループの最後にfa ++/fb ++の代わりにwhile-expressionをチェックした後、毎回faとfbをインクリメントする必要があります。だから、最終的なプログラムは次のようになります。

#include <semaphore.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

sem_t S1; 
sem_t S2; 
sem_t S3; 

int main() { 

    int fa = 0; 
    int fb = 0; 
    int sum = 0; 

    sem_init(&S1, 0, 4); 
    sem_init(&S2, 0, 0); 
    sem_init(&S3, 0, 0); 

    /* Proceso A*/ 
    while (fa++ < 4) { 
     sem_wait(&S1); 
     sum = sum + 2; 
     sem_post(&S2); 
    } 

    /* Proceso B*/ 
    while (fb++ < 2) { 
     sem_wait(&S2); 
     sem_wait(&S2); 
     sum = sum + 3; 
     sem_post(&S3); 
    } 

    /* Proceso C*/ 
    while (1) { /* Imprimir */ 
     sem_wait(&S3); 
     printf("%d\n", sum); 
     sem_post(&S1); 
     sem_post(&S1); 
     if (fa > 4 && fb > 2) 
      break; 
    } 

    return 0; 
} 

また、私は(0)、それは最初の反復の後に出て以来、コンマの代わりにprintfのためにn個破るために呼び出すと\を追加し、出口を変更しました。

これで14が印刷され、終了します。これが結果に役立つことを願っています。しかしセマフォをよく理解するには、何かから始めることをお勧めします。https://www.cs.mtu.edu/~shene/NSF-3/e-Book/SEMA/basics.html

関連する問題