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;
}
나는 이것을 만들었지 만 왜 효과가 없는지 확신하지 못했습니다. 두 프로세스 모두 "프로세스"기능을 시작하지만 더 이상 가지 않습니다.
, ie : (i == 0) 대신 (0 == i). –
그건 오랜 시간 동안 주목받지 못하는 종류의 악의적 인 실수입니다. (가장 악랄한 것은'#ifdef SOMEHTING'과 같은 컴파일 플래그에서 철자 오류가 생길 수 있습니다) ... 피드백의 경우 +1 – Rerito
@TomKnapen Constant 전에 변수 if 절은 Yoda를 수행합니다. – Yakk