Untitled

                Never    
C
       
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <time.h>

typedef struct {
    int w_kolejce;
    int miasto;
    // int kierunek;
}Samochod;

Samochod *tab_samochody;
int n;

pthread_mutex_t mutex_globalny = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex_most = PTHREAD_MUTEX_INITIALIZER;

time_t t;

int w_miescie_a = 0;
int w_miescie_b = 0;
int w_kolejce_a = 0;
int w_kolejce_b = 0;
int na_moscie = -1;

void *miasto(void *_nr);
void wypisz();

int main(int argc, char **argv) {
    int iret1;
    sscanf(argv[1], "%d", &n);
    pthread_t threads[n]; 
    srand(time(&t));

    tab_samochody = calloc(n, sizeof(Samochod));

    for(int i = 0; i < n; i++){
        tab_samochody[i].miasto = (i % 2);          // W JAKIM MIESCIE JEST DANY SAMOCHOD
        tab_samochody[i].w_kolejce = 1;             // CZY ZNAJDUJE SIE W KOLEJCE
        // tab_samochody[i].kierunek = (i + 1) % 2;    // W JAKIM KIERUNKU ZMIERZA SAMOCHOD
    }

    for(int i = 0; i < n; i++){
        if(tab_samochody[i].miasto == 0)
            if(tab_samochody[i].w_kolejce == 0){
                w_miescie_a += 1;
            }
            else{
                w_kolejce_a += 1;
            }
            else if(tab_samochody[i].miasto == 1){
            if(tab_samochody[i].w_kolejce == 0){
                w_miescie_b += 1;
            }
            else{
                w_kolejce_b += 1;
            }
        }
    }
    int tab_pom[n];
        for(int i = 0; i < n; i++){
            tab_pom[i] = i;
            iret1 = pthread_create( &threads[i], NULL, miasto, &tab_pom[i]);
            if(iret1) {
                fprintf(stderr,"Error - pthread_create() return code: %d\n", iret1);
                exit(EXIT_FAILURE);
            }
        }
        for(int i = 0; i < n; i++){
            pthread_join( threads[i], NULL);
        }
    exit(0);
}

void wypisz(){
    if(na_moscie != -1){
        if(tab_samochody[na_moscie].miasto == 0){
            printf("A-%d %d>>> [>> %d >>] <<<%d %d-B \n", w_miescie_a, w_kolejce_a, (na_moscie + 1), w_kolejce_b, w_miescie_b);
        }
        else{
            printf("A-%d %d>>> [<< %d <<] <<<%d %d-B \n", w_miescie_a, w_kolejce_a, (na_moscie + 1), w_kolejce_b, w_miescie_b);
        }     
    }
    else{
        printf("A-%d %d>>> [   #   ] <<<%d %d-B \n", w_miescie_a, w_kolejce_a, w_kolejce_b, w_miescie_b);
    }
}

void *miasto(void *_nr){
    while(1){
        pthread_mutex_lock(&mutex_most);
            pthread_mutex_lock(&mutex_globalny);
                int nr = *(int*)_nr;
                na_moscie = nr;
                if(tab_samochody[nr].miasto == 0){
                    w_kolejce_a -= 1;
                }
                else{
                    w_kolejce_b -= 1;
                }
                
                wypisz();                                   // WYPISYWANIE
            pthread_mutex_unlock(&mutex_globalny);

            usleep(500000 + (rand() % 1000000));
        pthread_mutex_unlock(&mutex_most);

        pthread_mutex_lock(&mutex_globalny);
            na_moscie = -1;
            if(tab_samochody[nr].miasto == 0){
                w_miescie_b += 1;
                tab_samochody[nr].miasto = 1;
            }
            else{
                w_miescie_a += 1;
                tab_samochody[nr].miasto = 0;
            }
            wypisz();                                           // WYPISYWANIE
        pthread_mutex_unlock(&mutex_globalny);
        
        usleep(2000000 + (rand() % 3000000));

        pthread_mutex_lock(&mutex_globalny);
            if(tab_samochody[nr].miasto == 0){
                w_miescie_a -= 1;
                w_kolejce_a += 1;
            }
            else{
                w_miescie_b -= 1;
                w_kolejce_b += 1;
            }
            wypisz();                                           // WYPISYWANIE
        pthread_mutex_unlock(&mutex_globalny);
    }
}

Raw Text