2013-04-19 2 views
2

그래서 숙제에 대한 코드를 쓰고 있는데, 상호 배타에 대한 Dekkers 알고리즘을 작성해야합니다.내가 Dekkers 알고리즘으로 잘못하고 있는지 확실하지 않다

#include <signal.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <iostream> 
using namespace std; 

int Id; /* Segment Id */ 
int *TURN; 
int *FLAG_I; 
int *FLAG_J; 

void get_out_of_critical(int i) 
{ 
    if(i=0){ 
     *TURN=1; 
     *FLAG_I=0; 
    } 
    else{ 
     *TURN=0; 
     *FLAG_J=0; 
    } 

} 

void get_in_critical(int i) 
{ 
    if(i=0){ 
     *FLAG_I=1; 
     while(*FLAG_J!=0){ 
     if(*TURN==1){ 
      *FLAG_I = 0; 
      while(*TURN==1){} 
     *FLAG_I=1; 
     } 
     } 
    } 
    if(i=1){ 
    *FLAG_J=1; 
    while (*FLAG_I!=0){ 
     if(*TURN==0){ 
      *FLAG_J = 0; 
      while(*TURN==0){} 
     *FLAG_J=1; 
     } 
     } 
    } 

} 

void process(int i) 
{ 
    for(int k=1;k<=5;k++){ 
     cout<<"Process - "<<i<<endl; 
     get_in_critical(i); 
     for(int m=1;m<=5;m++){ 
      cout<<"Process: "<<i+1<<", K.O. num: "<<k<<" ("<<m<<"/5)"<<endl; 
     } 
     get_out_of_critical(i); 
    } 
} 

void del(int sig) 
{ 
    /* free shared memory */ 
    (void) shmdt((char *) TURN); 
    (void) shmdt((char *) FLAG_I); 
    (void) shmdt((char *) FLAG_J); 
    (void) shmctl(Id, IPC_RMID, NULL); 
    exit(0); 
} 

int main() 
{ 
    /* allocating shared memory */ 
    Id = shmget(IPC_PRIVATE, sizeof(int)*100, 0600); 

    if (Id == -1) 
     exit(1); 

    TURN = (int *) shmat(Id, NULL, 0); 
    *TURN = 0; 
    FLAG_I = (int*) shmat(Id, NULL, 0); 
    FLAG_J = (int*) shmat(Id, NULL, 0); 
    *FLAG_I = 0; 
    *FLAG_J = 0; 
    sigset(SIGINT, del);// in case of signal interrupt, delete shared memory 

    /* starting paralel processes */ 
    if (fork() == 0) { 
     process(0); 
     exit(0); 
    } 
    if (fork() == 0) { 
     process(1); 
     exit(0); 
    } 
    wait(); 
    wait(); 
    del(0); 

    return 0; 
} 

나는 이것을 만들었지 만 왜 효과가 없는지 확신하지 못했습니다. 두 프로세스 모두 "프로세스"기능을 시작하지만 더 이상 가지 않습니다.

답변

2

오 하나님, 난 그냥 ..이 1-2h 디버깅과 같은 지출, 내가 대신 if(i==0)if(i=0)을 사용 알게 당신이 (항상) 식의 전면에있는 CONST (개미)들 둬야 이유

+5

, ie : (i == 0) 대신 (0 == i). –

+0

그건 오랜 시간 동안 주목받지 못하는 종류의 악의적 인 실수입니다. (가장 악랄한 것은'#ifdef SOMEHTING'과 같은 컴파일 플래그에서 철자 오류가 생길 수 있습니다) ... 피드백의 경우 +1 – Rerito

+0

@TomKnapen Constant 전에 변수 if 절은 Yoda를 수행합니다. – Yakk

관련 문제