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