Przetwarzanie wsp贸艂bie偶ne
Wojciech Kupczyk Data
Laboratorium 3
94415 13.03.2014, 14:30
Cele laboratorium:
佛 atrybuty w膮tk贸w PTHREADS.
Zrealizowane zadania: 1-6
Ad. 2. Uruchomienie na dziesi臋ciu w膮tkach funkcji wy艣wietlaj膮cej identyfikator w膮tku.
Program wy艣wietla kolejny numer (argument przekazany do w膮tku) oraz dodatkowo
TID identyfikator w膮tku.
#include
#include
#include
#include
void * zadanie_watku (void * arg_wsk);
main(){
int i,tablica_wyn[10];
pthread_t tablica_tid[10];
for(i=0; i<10; i++){
tablica_wyn[i] = pthread_create(&tablica_tid[i], NULL, zadanie_watku, &i);
tablica_wyn[i] = pthread_join(tablica_tid[i], NULL);
}
}
void * zadanie_watku (void * arg_wsk)
{
int moj_arg;
pid_t tid = (pid_t) syscall (SYS_gettid);
moj_arg = *( (int *) arg_wsk );
printf("Watek otrzymal argument %d. TID: %u\n",moj_arg,
tid);
sleep(1);
return(NULL);
}
Ad. 3. Za艂膮czony program watki.c zosta艂 przeanalizowany i uzupe艂niony, zgodnie ze
wskaz贸wkami ze skryptu. Uzupe艂niony kod funkcji main przedstawiony jest na
poni偶szym listingu, a poni偶ej zrzut ekranu z jego wykonania. 呕贸艂tym zakre艣leniem
zosta艂y zaznaczone dodane fragmenty kodu.
int main()
{
pthread_t tid;
pthread_attr_t attr;
void *wynik;
int i;
//W膮tek przy艂膮czalny
printf("watek glowny: tworzenie watku potomnego nr 1\n");
/*Tu wstaw kod tworzenia w膮tku z domy艣lnymi w艂asno艣ciami*/
pthread_create(&tid, NULL, zadanie_watku, NULL);
sleep(2); // czas na uruchomienie watku
printf("\twatek glowny: wyslanie sygnalu zabicia watku\n");
pthread_cancel(tid);
pthread_join(tid, &wynik);
//Co nalezy zrobi膰 przed sprawdzeniem czy w膮tki si臋 skonczy艂y?
//Przed sprawdzeniem nale偶y wywo艂a膰 pthread_join zapisuj膮c wynik wywo艂ania w zmiennej wynik
if (wynik == PTHREAD_CANCELED)
printf("\twatek glowny: watek potomny zostal zabity\n");
else
printf("\twatek glowny: watek potomny NIE zostal zabity - blad\n");
//Od艂膮czanie w膮tku
zmienna_wspolna = 0;
printf("watek glowny: tworzenie watku potomnego nr 2\n");
/*Tu wstaw kod tworzenia w膮tku z domy艣lnymi w艂asno艣ciami*/
pthread_create(&tid, NULL, zadanie_watku, NULL);
sleep(2); // czas na uruchomienie watku
printf("\twatek glowny: odlaczenie watku potomnego\n");
//Instrukcja od艂膮czenia?
pthread_detach(tid);
printf("\twatek glowny: wyslanie sygnalu zabicia watku odlaczonego\n");
pthread_cancel(tid);
//Czy watek zosta艂 zabity? Jak to sprawdzi膰?
printf("\twatek glowny: czy watek potomny zostal zabity \n");
printf("\twatek glowny: sprawdzanie wartosci zmiennej wspolnej\n");
for(i=0; i<10; i++)
{
sleep(1);
if(zmienna_wspolna!=0) break;
}
if (zmienna_wspolna == 0)
printf("\twatek glowny: odlaczony watek potomny PRAWDOPODOBNIE zostal zabity\n");
else
printf("\twatek glowny: odlaczony watek potomny PRAWDOPODOBNIE NIE zostal zabity\n");
//W膮tek od艂膮czony
//Inicjacja atrybut贸w?
pthread_attr_init(&attr);
//Ustawianie typu watku na od艂aczony
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
printf("watek glowny: tworzenie odlaczonego watku potomnego nr 3\n");
pthread_create(&tid, &attr, zadanie_watku, NULL);
//Niszczenie atrybut贸w
pthread_attr_destroy(&attr);
printf("\twatek glowny: koniec pracy, watek odlaczony pracuje dalej\n");
//pthread_exit(NULL); // co stanie sie gdy uzyjemy exit(0)?
exit(0);
}
Ad. 4. Na podstawie poprzedniego punktu stworzy艂em program, kt贸ry uruchamia funkcj臋
czasozajmowacz na 8 w膮tkach i przetestowa艂em dzia艂anie funkcji
pthread_attr_setstacksize oraz pthread_setaffinity_np. Poni偶ej za艂膮czam
fragmenty kodu, w kt贸rych wykorzystywane s膮 powy偶sze funkcje.
pthread_attr_setstacksize:
errno = pthread_attr_init(&attr);
if (errno) {
perror("pthread_attr_init");
return EXIT_FAILURE;
}
if (argc > 1) {
rozmiar = atoi(argv[1]);
printf("rozmiar stosu ustalony przez u偶ytkownika: %u\n", rozmiar);
printf("minimalny rozmiar stosu: %u\n", PTHREAD_STACK_MIN);
errno = pthread_attr_setstacksize(&attr, rozmiar);
test_errno("pthread_attr_setstacksize");
}
else {
pthread_attr_getstacksize(&attr, &rozmiar);
printf("domy艣lny rozmiar stosu: %u\n", rozmiar);
}
for(i=0; i<8; i++){
printf("watek glowny: tworzenie watku potomnego nr %d\n",i);
errno = pthread_create(&tablica_tid[i], &attr, zadanie_watku, &i);
test_errno("pthread_create");
pthread_join(tablica_tid[i], NULL);
sleep(1); // czas na uruchomienie watku
}
pthread_setaffinity_np:
thread = pthread_self();
/* Set affinity mask to include CPUs 0 to 7 */
CPU_ZERO(&cpuset);
for (j = 0; j < 8; j++)
CPU_SET(j, &cpuset);
s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_setaffinity_np");
/* Check the actual affinity mask assigned to the thread */
s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_getaffinity_np");
printf("Set returned by pthread_getaffinity_np() contained:\n");
for (j = 0; j < CPU_SETSIZE; j++)
if (CPU_ISSET(j, &cpuset))
printf(" CPU %d\n", j);
W艂a艣ciwo艣ci pthread_setschedparam zosta艂y om贸wione poni偶ej. Podana funkcja s艂u偶y do
modyfikowania priorytetu w膮tku. Jednym z jej argument贸w jest wskaznik na struktur臋 typu
sched_param, kt贸rej pole sched_priority okre艣la priorytet w膮tku. Elementy struktury
sched_param zosta艂y przedstawione w poni偶szej tabeli.
sched_priority
Priorytet normalny N na kt贸rym ma by膰 wykonywany dany w膮tek.
Priorytet obni偶ony L. B臋dzie on ustawiony przez system gdy w膮tek
sched_ss_low_priority
wyczerpie sw贸j aktualny bud偶et C.
sched_ss_max_repl
Maksymalna liczba zdarze艅 odnawiaj膮cych.
Okres T po kt贸rym bud偶et w膮tku zostanie odnowiony do wielko艣ci
sched_ss_repl_period
bud偶etu pocz膮tkowego C.
Ilo艣膰 czasu przez kt贸r膮 w膮tek mo偶e wykonywa膰 si臋 na normalnym
sched_ss_init_budget
priorytecie zanim priorytet jego obni偶y si臋 do L.
Ad. 5. Poni偶ej zamieszczam screen konsoli (htop) wykonany podczas dzia艂ania programu z
zadania 4 (czwarte_1).
Ad. 6. Nowy program, w kt贸rym zosta艂o stworzone 10 w膮tk贸w. Ka偶dy w膮tek otrzyma艂
losowe warto艣ci atrybut贸w, kt贸re nast臋pnie zosta艂y wy艣wietlone w procedurze w膮tku.
Kod zr贸d艂owy ca艂ej aplikacji i przyk艂adowy wydruk pokazuj膮cy wynik dzia艂ania
programu za艂膮czam poni偶ej.
void * zadanie_watku (void * arg_wsk)
{
pthread_attr_t attr;
pthread_getattr_np(pthread_self(), &attr);
int k;
size_t stack_size, guard_size;
void *stack_addr;
pthread_attr_getdetachstate(&attr, &k);
printf("Detach state = %d\n", k);
pthread_attr_setinheritsched(&attr, k);
printf("Inherit sched = %d\n", k);
pthread_attr_getguardsize(&attr, &guard_size);
printf("Guard size = %d bytes\n", guard_size);
pthread_attr_getstack(&attr, &stack_addr, &stack_size);
printf("Stack address = %p\n\n", stack_addr);
pthread_self(void);
pthread_attr_destroy(&attr);
return(NULL);
}
int main()
{
pthread_t tid[10];
pthread_attr_t attr;
void *wynik;
int i, los;
srand(time(0));
for(i = 0; i<10; i++)
{
pthread_attr_init(&attr);
srand(time(0));
los = rand()%2;
pthread_attr_setdetachstate(&attr, los);
srand(time(0));
los = rand()%2;
pthread_attr_setinheritsched(&attr, los);
pthread_create(&tid[i], &attr, zadanie_watku,
NULL);
pthread_attr_destroy(&attr);
sleep(1);
}
pthread_exit(NULL);
}
Wyszukiwarka
Podobne podstrony:
33B Skrzypek Mateusz LAB 5
33B Skrzypek Mateusz LAB 3 5
Lab BD Wojciech 膯wikli艅ski
Lab cpp
lab 2
T2 Skrypt do lab OU Rozdzia艂 6 Wiercenie 3
IE RS lab 9 overview
lab pkm 3
lab chemia korozja
lab tsp 3
MICHA艁 WOJCIECHOWSKI ZASADY SPO艁ECZNE STAREGO TESTAMENTU
Lab
wi臋cej podobnych podstron