Advertisement
Guest User

Untitled

a guest
Jan 26th, 2020
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<pthread.h>
  4.  
  5. int zmienna_wspolna=0;
  6.  
  7. #define WYMIAR 1000
  8. #define ROZMIAR WYMIAR*WYMIAR
  9. double a[ROZMIAR],b[ROZMIAR],c[ROZMIAR];
  10.  
  11.  
  12. double czasozajmowacz(){
  13. int i, j, k;
  14. int n=WYMIAR;
  15. for(i=0;i<ROZMIAR;i++) a[i]=1.0*i;
  16. for(i=0;i<ROZMIAR;i++) b[i]=1.0*(ROZMIAR-i);
  17. for(i=0;i<n;i++){
  18. for(j=0;j<n;j++){
  19. c[i+n*j]=0.0;
  20. for(k=0;k<n;k++){
  21. c[i+n*j] += a[i+n*k]*b[k+n*j];
  22. }
  23. }
  24. }
  25. return(c[ROZMIAR-1]);
  26. }
  27.  
  28. void * zadanie_watku (void * arg_wsk)
  29. {
  30. pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
  31. printf("\twatek potomny: uniemozliwione zabicie\n");
  32.  
  33. czasozajmowacz();
  34.  
  35. printf("\twatek potomny: umozliwienie zabicia\n");
  36. pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
  37.  
  38. pthread_testcancel(); // jesli cancelstate disabled - nie robi nic
  39.  
  40. zmienna_wspolna++;
  41. printf("\twatek potomny: zmiana wartosci zmiennej wspolnej\n");
  42.  
  43. return(NULL);
  44. }
  45.  
  46. int main()
  47. {
  48. pthread_t tid;
  49. pthread_attr_t attr;
  50. void *wynik;
  51. int i;
  52.  
  53. //Wątek przyłączalny (joinable)
  54.  
  55. printf("watek glowny: tworzenie watku potomnego nr 1\n");
  56.  
  57. /*Tu wstaw kod tworzenia wątku z domyślnymi własnościami*/
  58. pthread_create(&tid, NULL, zadanie_watku, NULL);
  59.  
  60. sleep(2); // czas na uruchomienie watku
  61.  
  62. printf("\twatek glowny: wyslanie sygnalu zabicia watku\n");
  63. pthread_cancel(tid);
  64.  
  65. //Co nalezy zrobić przed sprawdzeniem czy wątki się skonczyły?
  66. pthread_join(tid, &wynik);
  67. if (wynik == PTHREAD_CANCELED)
  68. printf("\twatek glowny: watek potomny zostal zabity\n");
  69. else
  70. printf("\twatek glowny: watek potomny NIE zostal zabity - blad\n");
  71.  
  72. //Odłączanie wątku
  73.  
  74. zmienna_wspolna = 0;
  75.  
  76. printf("watek glowny: tworzenie watku potomnego nr 2\n");
  77.  
  78. /*Tu wstaw kod tworzenia wątku z domyślnymi własnościami*/
  79. pthread_create(&tid,NULL,zadanie_watku,NULL);
  80. sleep(2); // czas na uruchomienie watku
  81.  
  82. printf("\twatek glowny: odlaczenie watku potomnego\n");
  83. //Instrukcja odłączenia?
  84. pthread_detach(tid);
  85.  
  86. printf("\twatek glowny: wyslanie sygnalu zabicia watku odlaczonego\n");
  87. pthread_cancel(tid);
  88.  
  89. //Czy watek został zabity? Jak to sprawdzić?
  90. printf("\twatek glowny: czy watek potomny zostal zabity \n");
  91. printf("\twatek glowny: sprawdzanie wartosci zmiennej wspolnej\n");
  92. for(i=0;i<10;i++){
  93. sleep(1);
  94. if(zmienna_wspolna!=0) break;
  95. }
  96.  
  97. if(zmienna_wspolna==0)
  98. printf("\twatek glowny: odlaczony watek potomny prawdopodobnie zostal zabity\n");
  99. else
  100. printf("\twatek glowny: odlaczony watek potomny prawdopodobnie nie zostal zabity\n");
  101. //Wątek odłączony
  102.  
  103. //Inicjacja atrybutów?
  104.  
  105. //Ustawianie typu watku na odłaczony
  106.  
  107. pthread_attr_init(&attr);
  108. pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);//ustawia czy watek joinable czy detached
  109.  
  110. printf("watek glowny: tworzenie odlaczonego watku potomnego nr 3\n");
  111. pthread_create(&tid, &attr, zadanie_watku, NULL);
  112.  
  113.  
  114. //Niszczenie atrybutów
  115. pthread_attr_destroy(&attr);
  116.  
  117.  
  118.  
  119.  
  120. printf("\twatek glowny: koniec pracy, watek odlaczony pracuje dalej\n");
  121. pthread_exit(NULL);
  122. // exit(0) omija wywolanie destruktorow o automatycznym czasie zycia
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement