#include #include #include #include #include //#define KRATKI_SEZNAM #define T 4 #ifdef KRATKI_SEZNAM #define N 13 #else #define N 53 #endif typedef struct{ int threadID; int idxStart; int iBlockSize; } thread_args_t; pthread_t nit[T]; pthread_barrier_t barrier; thread_args_t args[T]; void* funkcija_niti(void* args); void *(*pFunkcijaNiti)(void*) = funkcija_niti; time_t seconds; #ifdef KRATKI_SEZNAM unsigned int seznam[] = {7,4,3,6,5,2,8,9,1,0,10,12,11}; #else unsigned int seznam[N]; #endif unsigned int *pSeznam = &seznam[0]; void izpisi_seznam(unsigned int *pSeznam){ for (int i = 0; i < N; i++) { printf("%d ", *(pSeznam+i)); } printf("\n"); } void primerjaj_in_zamenjaj(unsigned int* a, unsigned int* b){ unsigned int temp; if (*b < *a) { temp = *a; *a = *b; *b = temp; } } void sodi_prehod(int iBlockSize, unsigned int* pSeznam, int threadID){ int iStart= (threadID*(N/T))%2; for (int i = iStart; i < iBlockSize; i=i+2){ primerjaj_in_zamenjaj(&pSeznam[i], &pSeznam[i+1]); } } void lihi_prehod(int iBlockSize, unsigned int* pSeznam, int threadID){ int iStart = (threadID*(N/T))%2; for (int i = 1 - iStart; i < iBlockSize; i=i+2){ primerjaj_in_zamenjaj(&pSeznam[i], &pSeznam[i+1]); } } void *funkcija_niti(void* arg){ thread_args_t* args = (thread_args_t*) arg; for (int i = 0; i < N; i++) { sodi_prehod(args->iBlockSize, pSeznam + (args->idxStart), args->threadID); pthread_barrier_wait(&barrier); /****************** P R E P R E K A ******************/ lihi_prehod(args->iBlockSize, pSeznam + (args->idxStart), args->threadID); pthread_barrier_wait(&barrier); /****************** P R E P R E K A ******************/ } } int main(){ #ifndef KRATKI_SEZNAM // init random generatorja: srand((unsigned) time(&seconds)); //init seznama: for(int i = 0; i < N; i++){ seznam[i] = rand() % (100); } #endif pthread_barrier_init(&barrier, NULL, T); izpisi_seznam(pSeznam); for (int i = 0; i < T; i++) { args[i].threadID = i; args[i].idxStart = i*((int) N / (int) T); if (i < T-1) args[i].iBlockSize = (int) N / (int) T; else args[i].iBlockSize = (int)((int)N / (int)T) + (int)((int)N % (int)T) - 1; pthread_create( &nit[i], NULL, pFunkcijaNiti, (void *) &args[i]); } for (int i = 0; i < T; i++) { pthread_join(nit[i], NULL); } pthread_barrier_destroy(&barrier); izpisi_seznam(pSeznam); }