#include #include #include #include #include #define N 9 unsigned int *pSeznam; pthread_barrier_t barrier; unsigned int seznam[ ] = {6, 1, 7, 8, 3, 2, 5, 4, 0}; void izpisi_seznam(unsigned int *pSeznam){ for (int j = 0; j < N; j++) { printf("%d ", *(pSeznam+j)); } printf("\n"); } void primerjaj_in_zamenjaj(unsigned int *a, unsigned int *b){ unsigned int temp; if (*b < *a){ temp = *b; *b = *a; *a = temp; } } void sodi_prehod(unsigned int *pSeznam){ for (int i = 0; i < (N-1); i=i+2) { primerjaj_in_zamenjaj((pSeznam+i), (pSeznam+i+1)); } } void lihi_prehod(unsigned int *pSeznam){ for (int i = 1; i < (N-1); i=i+2) { primerjaj_in_zamenjaj((pSeznam+i), (pSeznam+i+1)); } } int main(){ //pSeznam = (unsigned int *) malloc (N * sizeof(unsigned int)); pSeznam = seznam; izpisi_seznam(pSeznam); printf("\n\n"); // pri paralelizaciji bo to telo funkcije niti: // kot argument, mora nit dobiti indekse parov, ali košček seznama, ki ga bo urejala // po vsakem prehodu mora biti barrier for (int i = 0; i < N/2+1; i++) { sodi_prehod(pSeznam); izpisi_seznam(pSeznam); lihi_prehod(pSeznam); izpisi_seznam(pSeznam); } } /* PARALELIZACIJA: - Če imamo T niti, potem vsaka nit dobi (N/2)/T parov - en sam prehod delajo vzporedno vse niti - ko niti zaključijo en prehod (sodi ali lihi), se morajo počakati na prepreki! PREPREKE: 1. najprej jo deklariraj: pthread_barrier_t barrier; 2. potem jo inicializiraj: pthread_barrier_init() 3. niti ki morajo pocakati pred prepreko, kličejo: pthread_barrier_wait() 4. po zaključku programa, morate prepreko umaknit: pthread_barrier_destroy() */