2016-12-17 4 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

작은 프로그램에는 프로세스가 하나뿐이므로이 연습을하는 세마포어를 이해하는 것은 정말 어렵습니다.

실제로, 항상 첫 번째와 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; 
} 

은 또한 I (0) 휴식 호출 종료를 변경하고 첫 번째 반복 한 후 종료 이후 대신 콤마는 printf에 \ n을 추가 : 같은 최종 프로그램을 찾을 것입니다.

이렇게하면 14가 출력되고 종료됩니다. 희망이 결과와 함께 도움이됩니다. 하지만 세마포어를 더 잘 이해하기 위해서는 다음과 같이 시작하는 것이 좋습니다. https://www.cs.mtu.edu/~shene/NSF-3/e-Book/SEMA/basics.html