Przerobienie kodu na Klaster

0

Witam
Potrzebuje przerobić dany kod na kod w Klasterze a jestem całkowicie zielony. Czy ktoś mógł by mi pomóc z góry bardzo dziękuje.... Oraz poprawić ewentualne niedociągnięcia w kodzie....

#include <windows.h>	// pozwala na uzycie windows API
#include <stdio.h>		// pozwala na operacje I/O
#include <stdlib.h>		// pozwala na uzycie rand()
#include <time.h>       // pozwala inicjalizowac rand()

#define n 10		// liczba s. na polnoc
#define m 10		// liczba s. na poludnie

HANDLE northHandle, southHandle;		// 2 semafory
int sCounter=0;		// licznik s. na polnoc
int nCounter=0;     // licznik s. na poludnie
int sleepSouthCar[10];  // tablica zawiera czasy postoju pojazdow
int sleepNorthCar[10];

void southRun( int ID ) 
{    
        Sleep(sleepSouthCar[ID]); // chwilowe czekanie watku       
		printf("Samochod#%d chce jechac na Polnoc >>>???\n",ID); // komunikat o tym ze samochod chce jechac
		WaitForSingleObject(southHandle,INFINITE);	// czekamy na samochody, ktore wczesniej zadeklarowaly ze chca jechac w tym samym kierunku
			sCounter++; // zwiekszamy licznik samochodow jadacych w jednym kierunku
			if(sCounter==1)	// jesli jestesmy jako jedyni z jadacych w jedna strone to musimy sprawdzic czy ktos nie jedzie z na przeciwka
				WaitForSingleObject(northHandle,INFINITE);
		ReleaseSemaphore(southHandle,1,NULL); // zwalniamy semafor
            printf("Samochod#%d zaczal przejezdzac na Polnoce >>>>>>>>>>\n",ID);
        Sleep(sleepSouthCar[ID]/3); // czas przejazdu samochodu
			printf("-----------------------------------\n");
			printf("Samochod#%d przejechal na Polnoc >>>>>>>>>>>>>>>>\n",ID);
			printf("-----------------------------------\n\n");
        Sleep(sleepSouthCar[ID]/3); // 
		WaitForSingleObject(southHandle,INFINITE);	// znowu czekamy az wszystkie przed nami przejechaly
			sCounter--; // zmniejszamy licznik
			if(sCounter==0)	// jesli nie ma nikogo chetnego do przejazdu to pozwalamy przejezdzac samochodom z drugiej strony
			{   
				ReleaseSemaphore(northHandle,1,NULL);
            }
		ReleaseSemaphore(southHandle,1,NULL); // ponownie pozwalamy jechac naszym samochodom

} 

void northRun( int ID ) { // tak samo jak w funkcji southRun
     
        Sleep(sleepNorthCar[ID]);
		printf("Samochod#%d chce jechac na Poludnie <<<???\n",ID+10);

		WaitForSingleObject(northHandle,INFINITE);	// southHandle is useful to protect the counter refresh

			nCounter++;
			if(nCounter==1)	// if only this process want to read see if someone is northHandle
				WaitForSingleObject(southHandle,INFINITE);
		ReleaseSemaphore(northHandle,1,NULL);
            printf("Samochod#%d zaczal przejezdzac na Poludnie <<<<<<<<<<\n",ID+10);
        Sleep(sleepNorthCar[ID]/3);
			printf("-----------------------------------\n");
			printf("Samochod#%d przejechal na Poludnie <<<<<<<<<<<<<<<<<<\n",ID+10);
			printf("-----------------------------------\n\n");
        Sleep(sleepNorthCar[ID]/3);
		WaitForSingleObject(northHandle,INFINITE);	// same as first
			nCounter--;
			if(nCounter==0)	// if there are no fromSouth now if someone want to write it can
			{
				ReleaseSemaphore(southHandle,1,NULL);
            }
		ReleaseSemaphore(northHandle,1,NULL);

}

int main(int arg, char* arcgv[]) {

    srand(time(NULL)); // uruchomienie maszyny losujacej czasy. robi sie to po to aby nie miec zawsze tych samych
    
	HANDLE fromSouth[n], fromNorth[m]; // tablice uchwytow do watkow
	DWORD fromSouthID[n], fromNorthID[m]; // tablice z ID pojazdu

	southHandle=CreateSemaphore(NULL,1,1,NULL);	// tworzymy semafor dla watkow ktore odpowiadaja za samochody jadace na polnoc
	northHandle=CreateSemaphore(NULL,1,1,NULL);	// tworzymy semafor dla watkow ktore odpowiadaja za samochody jadace na poludnie

	if(northHandle==NULL || southHandle==NULL) { // sprawdzamy czy semafory sie poprawnie utworzyly
		printf("Semafory nie zostaly utworzone!!!\n");
		return 1; // jesli nie to wychodzimy z programu
	} 
	

	for(int i=0; i<n; i++) { // dla kazdego pojazdu
        sleepSouthCar[i+1]=rand()%5000; // ustawiam czas czekania    
		fromSouth[i]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)southRun,(LPVOID) (i+1),0,&fromSouthID[i]); // i uruchamiam dana funckje dla konkretnego pojazdu w watku
		if(fromSouth[i]==NULL) { // jesli watku nie udalo sie utworzyc to wyrzucamy komunikat o bledzie
			printf("Thread creation error !!!\n");
			return 2;
		} 
	} 

	for(int i=0; i<m; i++) { // tak samo dla samochodow jadacych na poludnie
        sleepNorthCar[i+1]=rand()%5000; 
		fromNorth[i]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)northRun,(LPVOID) (i+1),0,&fromNorthID[i]);
		if(fromNorth[i]==NULL) {
			printf("Thread creation error !!!\n");
			return 2;
		} 
	} 
	
	
	for(int i=0; i<n; i++)
		CloseHandle(fromSouth[i]); // zwalniamy uchwyty do watkow

	for(int i=0; i<m; i++)
		CloseHandle(fromNorth[i]);
		
	ExitThread(1);
	
	

	return 0;

}
0

To ktos bedzie tak miły i mi pomoże?

1 użytkowników online, w tym zalogowanych: 0, gości: 1