algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Algorytm Peterson'a dla 2 procesów - Implementacja w C/C++
Ocena użytkownikóww: *****  / 3
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 26 lipca 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

peterson2.c:
//(c)2002 Tomasz Lubinski
//www.algorytm.org
//algorytm Peterson'a dla 2 procesow - problem wzajemnego wykluczania


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>

void usun_pamiec()
{
int shmid;
shmid=shmget(101, 4, IPC_CREAT);
shmctl(shmid, IPC_RMID, NULL);
shmid=shmget(102, 4, IPC_CREAT);
shmctl(shmid, IPC_RMID, NULL);
shmid=shmget(103, 4, IPC_CREAT);
shmctl(shmid, IPC_RMID, NULL);
printf("Koniec\n");
exit(0);
}

int main()
{
int* flag[2];
int* turn;
int other, whose;

//zainicjowanie zmiennych wspoldzielonych
int shmid;
struct shmid_ds buf;

shmid=shmget(101, 4, IPC_CREAT);
shmctl(shmid, IPC_STAT, &buf);
buf.shm_perm.mode=0666;
shmctl(shmid, IPC_SET, &buf);
flag[0]=shmat(shmid, NULL, SHM_RND);
*flag[0]=0;

shmid=shmget(102, 4, IPC_CREAT);
shmctl(shmid, IPC_STAT, &buf);
buf.shm_perm.mode=0666;
shmctl(shmid, IPC_SET, &buf);
flag[1]=shmat(shmid, NULL, SHM_RND);
*flag[1]=0;

shmid=shmget(103, 4, IPC_CREAT);
shmctl(shmid, IPC_STAT, &buf);
buf.shm_perm.mode=0666;
shmctl(shmid, IPC_SET, &buf);
turn=shmat(shmid, NULL, SHM_RND);
*turn=0;

//po zakonczeniu wykonywania progamu pamiec wspoldzielona nalezy usunac. 
//po nacisnieciu klawiszy ctrl+c sygnal SIGINT jest przechwytywany i 
//uruchamiana jest funkcja usun_pamiec
signal(SIGINT, usun_pamiec);

printf("Program nalezy przerwac wciskajac ctrl+c\n\n");

//algorytm Peterson'a dla 2 procesow
if (fork()==0)
	{
	//proces 1
	while(1)
		{
		printf("P1 jest poza sekcja krytyczna\n");
		sleep(random()%10);
		printf("P1 chce wejsc do sekcji krytycznej\n");
		*flag[0]=1;
		*turn=1;
		do
			{
			whose=*turn;
			other=*flag[1];
			} while(whose==1&&other==1);
		printf("\t\t\tP1 jest w sekcji krytycznej\n");
		sleep(random()%10);
		*flag[0]=0;
		}
	}

	else
	{
	//proces 2
	while(1)
		{
		printf("P2 jest poza sekcja krytyczna\n");
		sleep(random()%10);
		printf("P2 chce wejsc do sekcji krytycznej\n");
		*flag[1]=1;
		*turn=0;
		do
			{
			whose=*turn;
			other=*flag[0];
			} while(whose==0&&other==1);
		printf("\t\t\tP2 jest w sekcji krytycznej\n");
		sleep(random()%10);
		*flag[1]=0;
		}
	}
}
Dodaj komentarz