Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C by kkl ( 16 years ago )
//WÄ…ski most
//na zmiennej warunkowej

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<time.h>

#define CZAS_MOST 2 //przejazd przez most zajmuje 2 sek
#define CZAS_PRZED_MOST 1 //zanim wjedziemy na most czekamy 1 sek
#define CZAS_MIASTO 1+rand()%5  //w miescie czekamy max 5 sek

int A=0; //ilosc samochodow w miescie A
int przedA=0; //ilosc samochodow czekajacych na most po stronie A
int most_kto=-1;
int most_kierunek=0;
int przedB=0; //ilosc samochodow czekajacych na most po stronie B
int B=0; //ilosc samochodow w miescie B

pthread_cond_t most;
pthread_mutex_t pisz;
pthread_mutex_t zmiana;

void wypisz();
void *AdoB(void*);
void *BdoA(void*);

void wypisz(){
 pthread_mutex_lock(&pisz;);
 if(most_kierunek==1){
  printf("A-%d %d>>> [>> %d >>] <<<%d %d-B\n",A,przedA,most_kto,przedB,B);
  pthread_mutex_unlock(&pisz;);
  return;
 }
 if(most_kierunek==-1){
  printf("A-%d %d>>> [<< %d <<] <<<%d %d-B\n",A,przedA,most_kto,przedB,B);
  pthread_mutex_unlock(&pisz;);
  return;
 }
 else{
  printf("A-%d %d>>> [>> - <<] <<<%d %d-B\n",A,przedA,przedB,B);
  pthread_mutex_unlock(&pisz;);
  return;
 }
}

//jedziemy z miasta A do B
void *AdoB(void *param){
 int i = (int)param;

 sleep(CZAS_MIASTO);

 pthread_mutex_lock(&zmiana;);
 --A;
 ++przedA;
 wypisz();
 pthread_mutex_unlock(&zmiana;);

 sleep(CZAS_PRZED_MOST);

 pthread_mutex_lock(&zmiana;);
 while(most_kierunek!=0)
  pthread_cond_wait(&most;,&zmiana;); //most zajety czekamy
 --przedA;
 most_kto=i; //numer samochodu na moscie
 most_kierunek=1; //1 oznacz A>>B
 wypisz();
 pthread_mutex_unlock(&zmiana;);

 sleep(CZAS_MOST);

 pthread_mutex_lock(&zmiana;);
 most_kto=-1; //nikt nie jedzie po moscie
 most_kierunek=0; //nikt nie jedzie po moscie
 ++B;
 wypisz();
 pthread_cond_signal(&most;); //sygnalizujemy zwolnienie mostu
 //printf("%d wolny\n",i);
 pthread_mutex_unlock(&zmiana;);

 BdoA(param); //trafiamy do miasta A, zmiana funkcji
}

//jedziemy z miasta B do A
void *BdoA(void *param){
 int i = (int)param;

 sleep(CZAS_MIASTO);

 pthread_mutex_lock(&zmiana;);
 --B;
 ++przedB;
 wypisz();
 pthread_mutex_unlock(&zmiana;);

 sleep(CZAS_PRZED_MOST);

 pthread_mutex_lock(&zmiana;);
 while(most_kierunek!=0)
  pthread_cond_wait(&most;,&zmiana;); //most zajety czekamy
 --przedB;
 most_kto=i; //numer samochodu na moscie
 most_kierunek=-1; //-1 oznacz B>>A
 wypisz();
 pthread_mutex_unlock(&zmiana;);

 sleep(CZAS_MOST);

 pthread_mutex_lock(&zmiana;);
 most_kto=-1; //nikt nie jedzie po moscie
 most_kierunek=0; //nikt nie jedzie po moscie
 ++A;
 wypisz();
 pthread_cond_signal(&most;); //sygnalizujemy zwolnienie mostu
 //printf("%d wolny\n",i);
 pthread_mutex_unlock(&zmiana;);

 AdoB(param); //trafiamy do miasta A, zmiana funkcji
}


int main(){
 srand(time(0));

 //wczytanie liczby samochodow
 int n;
 printf("ile: ");
 scanf("%d", &n);
 if(n<1){ printf("nie ma co ganiac po moscie paka\n"); return 0; }
 pthread_t cars[n];

 //inicjalizacja mutexow i zmiennej warunkowej
 pthread_cond_init(&most;,NULL);
 pthread_mutex_init(&pisz;,NULL);
 pthread_mutex_init(&zmiana;,NULL);
 
 //tworzymy watki
 pthread_mutex_lock(&zmiana;); //aby ruszyly wszystkie na raz
 int i;
 for(i=0;i<n;++i){ //parzyste zaczynaja w A, nieparzyste w B
  if(i%2==0){ ++A;
  pthread_create(&cars;[i],NULL,&AdoB;,(void*)i); }
  else{ ++B;
  pthread_create(&cars;[i],NULL,&BdoA;,(void*)i); }
 }
 
 //wypisujemy START - wszystkie samochody sa juz w miastach
 pthread_mutex_lock(&pisz;);
 printf("START\n");
 pthread_mutex_unlock(&pisz;);
 wypisz(); 
 pthread_mutex_unlock(&zmiana;); //pojechali :)

 //oczekiwanie na wykonanie watkow
 for(i=0;i<n;++i)
  pthread_join(cars[i],NULL);

 //niszczenie mutexow i zmiennej warunkowej
 pthread_cond_destroy(&most;);
 pthread_mutex_destroy(&pisz;);
 pthread_mutex_destroy(&zmiana;);

 return 0;
}

 

Revise this Paste

Your Name: Code Language: