/* * Przykładowy program dla kursu "POSIX Threads" z wikibooks.pl * * Temat: odczyt czasu CPU, jaki zużył wątek * * Autor: Wojciech Muła * Ostatnia zmiana: 2010-03-xx */
#define _POSIX_C_SOURCE 200809L#include<stdlib.h>#include<stdio.h>#include<errno.h>#include<pthread.h>#include<unistd.h>#include<time.h> // sleep#include<string.h> // strerror#define test_errno(msg) do{if (errno) {perror(msg); exit(EXIT_FAILURE);}} while(0)// funkcja zwraca czas w milisekundach dla wskazanego zegaralongclock_ms(constclockid_tid_zegara);// funkcja zwraca czas CPU dla wątku (w milisekundach)longget_thread_time(pthread_tid);/* parametry wątku */typedefstruct{intid;// numerintn;// liczba iteracji}parametry;// funkcja wątkuvoid*watek(void*_arg){parametry*arg=(parametry*)_arg;inti;printf("wątek #%d uruchomiony, dwa razy wykona %d pustych pętli\n",(int)arg->id,(int)arg->n);for(i=0;i<arg->n;++i)/* zużycie czasu procesora */;sleep(2);for(i=0;i<arg->n;++i)/* zużycie czasu procesora */;/* podsumowanie pracy */printf("wątek #%d zakończony, zużył %ldms czasu procesora\n",(int)arg->id,clock_ms(CLOCK_THREAD_CPUTIME_ID));returnNULL;}//------------------------------------------------------------------------#define N 10 // liczba wątkówintmain(){pthread_tid[N];parametryparam[N];inti;srand(time(NULL));printf("początek programu, uruchomianie zostanie %d wątków\n",N);/* utworzenie wątku */for(i=0;i<N;++i){param[i].id=i;param[i].n=rand()%100000000+1;errno=pthread_create(&id[i],NULL,watek,¶m[i]);test_errno("pthread_create");}/* stan na mniej więcej półmetku */sleep(1);puts("po około sekundzie wątki zużyły:");for(i=0;i<N;++i)printf("* #%d: %ldms\n",i,get_thread_time(id[i]));/* oczekiwanie na zakończenie wątków */for(i=0;i<N;++i){errno=pthread_join(id[i],NULL);test_errno("pthread_join");}/* jeszcze podsumowanie */puts("");printf("główny wątek zużył %ldms czasu procesora\n",clock_ms(CLOCK_THREAD_CPUTIME_ID));printf("proces zużył %ldms czasu procesora\n",clock_ms(CLOCK_PROCESS_CPUTIME_ID));returnEXIT_SUCCESS;}//------------------------------------------------------------------------longget_thread_time(pthread_tid){clockid_tid_zegara;errno=pthread_getcpuclockid(id,&id_zegara);test_errno("pthread_getcpuclockid");returnclock_ms(id_zegara);}//------------------------------------------------------------------------longclock_ms(constclockid_tid_zegara){structtimespecczas;if(clock_gettime(id_zegara,&czas)){perror("clock_gettime");exit(EXIT_FAILURE);}elsereturn(czas.tv_sec*1000)+(czas.tv_nsec/1000000);}//------------------------------------------------------------------------