#include #include #include #include #include #define NTHREADS 5 typedef struct { unsigned int thread_ID; } argumenti_t; /* timespec is a struct defined in ctime as * struct timespec { * time_t tv_sec; // seconds * long tv_nsec; // nanoseconds * }; */ struct timespec timeStart, timeEnd; pthread_t nit[NTHREADS]; pthread_mutex_t kljucavnica[NTHREADS]; void* funkcija_niti(void* arg); void* (*pfunkcija_niti)(void*); argumenti_t args[NTHREADS]; int main(){ pfunkcija_niti = funkcija_niti; for (int i = 0; i < NTHREADS; i++) { args[i].thread_ID = i; pthread_create(&(nit[i]), // kazalec na nit, ki jo ustvarjamo NULL, pfunkcija_niti, // funkcija, ki jo izvede ustvarjena nit (void*) &args[i]); // argumenti funkcije, ki jo izvede ustvarjena nit - // edini argument je navaden void naslov, zato moram naslov na strukturo args1 // pretvorit v navaden void naslov } clock_t start = clock(); clock_gettime(CLOCK_REALTIME, &timeStart); // Počakajmo , da se vse niti zaključijo. V ta namen uporabim funkcijo join: for (int i = 0; i < NTHREADS; i++) { pthread_join(nit[i], NULL); } // šele sedaj je varno zaključiti main(). clock_gettime(CLOCK_REALTIME, &timeEnd); clock_t end = clock(); double time_taken = ((double)(end-start))/CLOCKS_PER_SEC; // calculate the elapsed time double elapsed_time = (timeEnd.tv_sec - timeStart.tv_sec) + (timeEnd.tv_nsec - timeStart.tv_nsec) / 1e9; // in seconds printf("Čas izvajanja: %f sekund \n", time_taken); printf("Čas izvajanja: %f sekund \n", elapsed_time); return 0; } void* funkcija_niti(void* arg){ // argument arg je navaden void nasalov, ki ga želim uporabiti za dostop do elementov strukture, na katero kaže. // Zato moram definirati nov kazalec na sterukturo in argument castat na ta tip argumenti_t* argumenti = (argumenti_t*) arg; unsigned int myID = argumenti->thread_ID; for(int i = 0; i<10; i++) { printf("Iteracija: %d \n\n", i); while(1){ // pograbi levo palčko = zakleni levo ključavnico pthread_mutex_lock(&kljucavnica[(myID+1) % NTHREADS]); //printf("Sem nit %d in pograbim levo palčko %d \n",myID, (myID+1)%NTHREADS ); //usleep(3000*myID*(5-i) + 1889*i); // poskusi vzeti desno palčko = zakleni desno ključavnico if (pthread_mutex_trylock(&kljucavnica[argumenti->thread_ID]) == 0 ) { break; } pthread_mutex_unlock(&kljucavnica[(myID+1) % NTHREADS]); } //printf("Sem nit %d in pograbim desno palčko %d \n", myID, myID); //usleep(30*myID*(3*i) + 89*i); // jej: printf("Sem nit %d in jem... \n", myID); usleep(1359*myID*(1*i) + 8*i); // odloži palčki: pthread_mutex_unlock(&kljucavnica[myID]); //printf("Sem nit %d in odložim desno palčko %d \n", myID, myID); //usleep(124*myID*(5-i) + 78*i); //pthread_mutex_unlock(&kljucavnica[(myID+1) % NTHREADS]); //printf("Sem nit %d in odložim levo palčko %d \n",myID, (myID+1)%NTHREADS ); //usleep(12*myID*(3*i) + 17*i); // razmišljaj: printf("Sem nit %d in razmisljam... \n", myID); usleep(2080*myID*(39*i) + 1890*(i+1)); } }