Wielowątkowość w C

0

Po pierwsze, czy ten kod powinien wyświetlać 1 i 2 w dowolnej kolejności?
Bo ja już nie wiem. u mnie wyswietla 22222111111
Czy to online compiler nie obsługuje wielu wąktów?.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>



void* p (void* l) { // funkcja watku (watek)
      int i=0;
      while (i<10) {
          i++;
          printf("%d ",1);
      }
      
     return 0;     
}


void* q (void* l) { // funkcja watku (watek)
     
      int i=0;
      while (i<10) {
          i++;
          printf("%d ",2);
      }

      return 0;
}


int main () {
	pthread_t w1,w2;
		
		
    pthread_create(&w1, 0, p,0); 		
    pthread_create(&w2, 0, q,0); 				
	

  
    pthread_join(w1,NULL); 	
    pthread_join(w2,NULL); 
  
  
  printf("\nkoniec procesu\n");

  
  
return 0;
}
0

22222111111 to też dowolna kolejność :D może po prostu online compiler ma za mało wolnych rdzeni, albo po 10 znaków to za mało, żeby zaobserwować mieszanie się.

0

Czyli dobrze myślę?
Output dla 100 liczb:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Czyli to nie działa poprawnie?
bo wykonują się najpierw 1 funkcja, a potem następna

1

Teraz zauważyłem, że używasz printf, a on buforuje tekst do napotkania nowej linii. Spróbuj dołożyć \n na końcu. Ale i tak to jest zbyt słaby przykład na pokazanie wielowątkowości. Spróbuj jakieś długotrwałe obliczenia podzielić na 2 części obliczane osobno i wtedy mierzyć czas albo coś :)

0

Przy dodaniu sleep(3) i sleep(1) do funkcji widać że są razem wykonywane...
BOżżze jak ja nienawidzę wielowątkowści.

4

Ten kod może wyświetlać ciąg 1 i 2 w dowolnej kolejności, w szczególności Twój wynik jest jak najbardziej możliwy. I to nie oznacza jednowątkowości. Dodaj w q() i p() w pętlach while coś takiego: usleep(10);. Wynik może ulec zmianie, poeksperymentuj z argumentem 10. Zobaczysz, że funkcje wykonywane są równolegle.
Generalnie rzecz ujmując problematyka jest złożona bowiem w grę wchodzi bardzo wiele czynników np. czy wątki będą wykonywane na osobnych fizycznych rdzeniach CPU, jakie jest aktualne obciążenie maszyny, czy i jak synchronizowana jest funkcja printf itp. Generalnie rzecz ujmując w tym przypadku nie możesz nic zakładać co do kolejności. Jeśli chcesz mieć wpływ na kolejność to musisz synchronizować wątki.

3

Moja rada, jeśli jesteś początkujący, to omijaj wątki szerokim łukiem, dopóki nie nabierzesz większych umiejętności.
Cały problem z wielowątkowością polega na tym, że łatwo uzyskać jakiś efekt, który wygląda na poprawny i nie zdawać sobie sprawy z poważnych błędów.
Niedeterministyczność wielowątkowości (której właśnie doświadczyłeś) powoduje, że błędy są trudne w zrozumieniu i naprawieniu, szczególnie jeśli się ma braki podstawach programowania i podstawowej wiedzy z o właściwościach hardware'u.

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