pthread a oczekiwanie na zakończenie wątku

0

"Warto więc zwrócić uwagę, że utworzenie wątku typu joinable i nie
wywołanie wspomnianej funkcji skutkować będzie wyciekiem pamięci
(następstwem którego tworzenie nowych wątków może stać się niemożliwe)."

w tym kontekscie mam pytanie:
Rozumiem, że poniższy kod jest błędny i gorzi wyciekiem pamięci ?

#include <iostream>
#include <string>
#include <pthread.h>
#include <errno.h>
void* wypisz_sie(void* a)
{
    std::cout<<pthread_self()<<"\n";
    pthread_exit(NULL);
    //return;
}

int main()
{
    pthread_t id;
    pthread_create(&id, NULL, wypisz_sie, NULL);
    //        pthread_join(id, NULL);   jak tego nie ma a program dalej bedzie tworzyl watki i dziala dlugo to nastpai wyciek ?? a jak to bedzie to po zakonczeniu watku usuwa sie jego smieci
    return 0;
}
 

DObrze rozumiem to co napisalem w komentarzu w kodzie ?

0

Zakończenie programu usuwa wszystkie wątki i pamięć przydzieloną przez program, więc nie ma mowy o wycieku w momencie gdy program się zakończył.

Oczywiście dobrze jest jednak samemu zwalniać w programie wszystko, co jest do zwolnienia.

Twój kod (bez join) jest zły o tyle, że nie masz gwarancji że cout się wykona przed zakończeniem programu — a jeśli nie zdąży, wątek zostanie ubity i nic się nie wyświetli.

0
#include <iostream>
#include <string>
#include <pthread.h>
#include <errno.h>
#define N 10
void* wypisz_sie(void* a)
{
    std::cout<<*(int*)a<<" -> "<<pthread_self()<<"\n";
    pthread_exit(NULL);
    //return;
}

int main()
{
    pthread_t* id[N];

    for(int i = 0 ; i < N ; ++i)
    {
        id[i] = new pthread_t;
        pthread_create(id[i], NULL, wypisz_sie, (void*)&i);
    }
    for(int i = 0 ; i < N ; ++i)
        {
            pthread_join(*id[i], NULL);
        }
    for(int i = 0 ; i < N ; ++i)
            {
                delete id[i];
            }
    return 0;
} 

A w tym kodzie dlaczego na wyjsciu zamiast
1 -> nr watku
2 -> nr watku
3 -> nr watku
4 -> nr watku
5 -> nr watku
6 -> nr watku
7 -> nr watku
8 -> nr watku
.
.
jest :
10 -> nr watku
10 -> nr watku
10 -> nr watku
10 -> nr watku
.
.
.
.
.
10 razy
?

0

Już załatwione, i bylo jako wskaznik przeciez -_-

0

Po kiego te new i delete?

int main()
  {
   pthread_t id[N];
 
   for(int i=0;i<N;++i) pthread_create(id+i, NULL, wypisz_sie, (void*)&i);
   for(int i=0;i<N;++i) pthread_join(id[i], NULL);
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1