Linux, Wątki

0

Dobry Wieczór

Mam 2pytanka dotyczące wątków dot. poniższego kodu :

 
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
 
 
using namespace std;
 
void* fun1(void *w)
{
  for(long i = 0; i < 1000000000; ++i);
  cout <<"Jestem watkiem nr " << (int)w << endl; 
  cout <<"watek nr " << (int)w << " ma pid " << getpid() << endl;
  return 0;
}
 
 
int main()
{
/*
 fun1((void*)1);
 cout << "===========" << endl;
 fun1((void*)2);
*/
 
pthread_t p1,p2; 
  cout << "LINUX" << endl;
  pthread_create(&p1, 0, fun1, (void*)1);
  pthread_create(&p2, 0, fun1, (void*)2);
  cout << "Koniec imprezy " << endl;
 phtread_join(p1, 0);
 pthread_join(p2, 0);

return 0;
}

Dlaczego dostaję komunikat w takiej postaci ??
LINUX
Koniec imprezy
jestem watkiem nr 1
watek nr 1 ma pid 21496
jestem wątkiem nr 2
watek nr 2 ma pid 21496

Skoro najpierw wywołuję funkcję we wątkach, a potem koniec imprezy i czekam aż wątki p1, p2 się zakończą.

Pozdrawiam
Alan

0

Dostajesz komunikat w takiej postaci, ponieważ wątki wykonywane są równolegle. W tym samym czasie(w uproszczeniu) działają w Twoim programie 3 funkcje. 2x fun1 oraz 1x main. a napis "Koniec imprezy" dostajesz wcześnie, ponieważ najpierw go wypisujesz a dopiero później czekasz na zakończenie wątków - ale to zachowanie nie jest deterministyczne, ponieważ bez synchronizacji wątków nie masz żadnej kontroli nad tym, który jest aktualnie wykonywany.
Proponuję zrobić następujący eksperyment. W funkcji fun1 wypisuj coś w pętli - np. argument w. W mainie w pętli wypisuj coś innego. Zobaczysz, że wypisywane ciągi będą się przeplatały.

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