Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <pthread.h>
- #include <stdio.h>
- int N;
- int leweMiasto;
- int praweMiasto;
- int kolejkaPoLewejStronie;
- int kolejkaPoPrawejStronie;
- pthread_mutex_t most;
- int samochodNaMoscie;
- int *nrSamochoduIJegoMiasto;
- pthread_t *samochod;
- pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
- void czekanieWMiescie()
- {
- printf("CZEKANIE W MIESCIE\n");
- printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
- sleep(20);
- }
- void *przejazdMostemZmienneWarunkowe(int numerSamochodu)
- {
- pthread_mutex_lock(&most);
- printf("JEDZIE\n");
- if (nrSamochoduIJegoMiasto[numerSamochodu] == 0)
- {
- kolejkaPoLewejStronie--;
- printf("A-%d %d>>>[>>%d>>]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, numerSamochodu, kolejkaPoPrawejStronie, praweMiasto);
- samochodNaMoscie = numerSamochodu;
- sleep(5);
- nrSamochoduIJegoMiasto[numerSamochodu] = 1;
- praweMiasto++;
- }
- else
- {
- kolejkaPoPrawejStronie--;
- printf("A-%d %d>>>[<<%d<<]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, numerSamochodu, kolejkaPoPrawejStronie, praweMiasto);
- samochodNaMoscie = numerSamochodu;
- sleep(5);
- nrSamochoduIJegoMiasto[numerSamochodu] = 0;
- leweMiasto++;
- }
- pthread_mutex_unlock(&most);
- printf("MOST ODBLOKOWANY\n");
- pthread_cond_signal(&cond);
- }
- void *jazdaDoDrugiegoMiastaZW(void *numerSamochodu)
- {
- while (1)
- {
- int n = (int)numerSamochodu;
- if (nrSamochoduIJegoMiasto[n] == 0)
- {
- leweMiasto--;
- kolejkaPoLewejStronie++;
- printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
- }
- else
- {
- praweMiasto--;
- kolejkaPoPrawejStronie++;
- printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
- }
- if (samochodNaMoscie == -1)
- {
- przejazdMostemZmienneWarunkowe(numerSamochodu);
- czekanieWMiescie();
- }
- else
- {
- pthread_cond_wait(&cond, &most);
- printf("OBUDZIL SIE\n");
- przejazdMostemZmienneWarunkowe(numerSamochodu);
- czekanieWMiescie();
- }
- }
- }
- // Sposob bez zmiennych warunkowych.
- void *przejazdMostem(int numerSamochodu)
- {
- pthread_mutex_lock(&most);
- if (nrSamochoduIJegoMiasto[numerSamochodu] == 0)
- {
- kolejkaPoLewejStronie--;
- printf("A-%d %d>>>[>>%d>>]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, numerSamochodu, kolejkaPoPrawejStronie, praweMiasto);
- sleep(5);
- nrSamochoduIJegoMiasto[numerSamochodu] = 1;
- }
- else
- {
- kolejkaPoPrawejStronie--;
- printf("A-%d %d>>>[<<%d<<]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, numerSamochodu, kolejkaPoPrawejStronie, praweMiasto);
- sleep(5);
- nrSamochoduIJegoMiasto[numerSamochodu] = 0;
- }
- pthread_mutex_unlock(&most);
- }
- void *jazdaDoDrugiegoMiasta(void *numerSamochodu)
- {
- while (1)
- {
- int n = (int)numerSamochodu;
- if (nrSamochoduIJegoMiasto[n] == 0)
- {
- kolejkaPoLewejStronie++;
- leweMiasto++;
- printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
- przejazdMostem(numerSamochodu);
- praweMiasto++;
- printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
- czekanieWMiescie();
- }
- else
- {
- kolejkaPoPrawejStronie++;
- praweMiasto--;
- printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
- przejazdMostem(numerSamochodu);
- leweMiasto++;
- printf("A-%d %d>>>[]<<<%d %d-B\n", leweMiasto, kolejkaPoLewejStronie, kolejkaPoPrawejStronie, praweMiasto);
- czekanieWMiescie();
- }
- }
- }
- int main(int argc, char *argv[])
- {
- if (atoi(argv[1]) > 0)
- {
- N = atoi(argv[1]);
- }
- else
- {
- printf("Zly parametr\n");
- }
- int numerRozwiazania = 0;
- if (argc > 2)
- {
- numerRozwiazania = atoi(argv[2]);
- }
- //pthread_t samochod[N];
- samochod = malloc(sizeof(pthread_t) * N);
- leweMiasto = N;
- int i;
- nrSamochoduIJegoMiasto = malloc(sizeof(int) * N);
- pthread_mutex_init(&most, NULL);
- printf("A-%d 0>>>[]<<<0 0-B\n", N);
- switch (numerRozwiazania)
- {
- case 2:
- samochodNaMoscie = -1;
- for (i = 0; i < N; i++)
- pthread_create(&samochod[i], NULL, jazdaDoDrugiegoMiastaZW, (void *)i);
- for (i = 0; i < N; i++)
- pthread_join(samochod[i], NULL);
- break;
- default:
- for (i = 0; i < N; i++)
- pthread_create(&samochod[i], NULL, jazdaDoDrugiegoMiasta, (void *)i);
- for (i = 0; i < N; i++)
- pthread_join(samochod[i], NULL);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement