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;
}