• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

program współbieżny C

Object Storage Arubacloud
0 głosów
231 wizyt
pytanie zadane 15 października 2021 w C i C++ przez cba Użytkownik (620 p.)

Witam, czy mógłby ktoś mi wytłumaczyć działanie programu poniżej a mianowicie czemu najpierw wypisuje się liczba 2 a nie 1 (podejrzewam że jest to sprawka pthread_join ale jakoś nie mogę ogarnąć ich działania w tym programie) a także czemu ten program jest współbieżny?

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

void* p (void* l)
{
int i = 0;
for(i;i<10;i++)
{
printf("%d ",1);
fflush(stdout);
usleep(500000);
}
return 0;
}

void* q (void* l)
{
int i = 0;
for(i;i<10;i++)
{
printf("%d ",2);
fflush(stdout);
usleep(500000);
}
return 0;
}

int main(){
	pthread_t w1=0, w2=0;

	pthread_create(&w1, 0, p, 0);
	pthread_create(&w2, 0, q, 0);

	pthread_join(w1, NULL);
	pthread_join(w2, NULL);

	printf("koniec");

	return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 15 października 2021 przez adrian17 Ekspert (344,860 p.)

a także czemu ten program jest współbieżny?

Bo... masz dwa wykonujące się wątki? Trochę dziwne pytanie :)

czemu najpierw wypisuje się liczba 2 a nie 1 (podejrzewam że jest to sprawka pthread_join

Nie. Po prostu gdy masz wiele wątków, to system decyduje kiedy który wykonywać; czasem zwyczajnie tak się złoży, że wątek z `2` zostanie wybudzony przed wątkiem z `1` i tyle.

pthread_join po prostu sprawia że główny wątek programu czeka aż oba stworzone przez Ciebie wątki się zakończą.

komentarz 15 października 2021 przez cba Użytkownik (620 p.)
Okej tylko czemu ta 2 jest zawsze pierwsza z każdym uruchomieniem programu. Jeśli zmieni się kolejność w kodzie tworzenia wątku na odwrotna to wtedy następuje zmiana kolejności wypisywana i próbuje zrozumieć dlaczego tak się dzieje
komentarz 15 października 2021 przez Oscar Nałogowiec (29,290 p.)

Trochę jak standardowa odpowiedź adminisratora, ale tak wyszło:

U mnie pierwsza jest 1.

Skopiowałem, skompilowałem i uruchomiłem - u mnie działa inaczej.

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



Co akurat jest normalne dla wielobieżności. Założenie jest takie, że każda kolejność jest poprawna. Nie zrozumiesz tego - bo to zależy od szczegółów implementacji schedulera procesów w jądrze systemu. Jest wiele różnych algorytmów, każdy ma swoje przewagi z konkretnych sytuacjach, a wady w innych. Żaden nie jest jakoś uniwersalnie "najlepszy", i jednocześnie większość z nich jest wystarczająco dobra (czytaj działa) dla przeciętnych zastosowań.

Jeśli zależy ci na konkretnej kolejności wykonania operacji, to przy programowaniu wielobieżnym musisz o to zadbać sam - stosując odpowiednie mechanizmy synchronizacji procesów/wątków. To całkiem spory kawałek wiedzy.

komentarz 15 października 2021 przez adrian17 Ekspert (344,860 p.)

Okej tylko czemu ta 2 jest zawsze pierwsza z każdym uruchomieniem programu.

Nie zawsze; zależy od szczęścia i środowiska w różnych proporcjach. Na przykład u mnie trzy przykładowe wyjścia są:

1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 koniec
1 2 1 2 1 2 1 2 1 2 1 2 2 1 2 1 1 2 2 1 koniec
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 koniec

 

komentarz 15 października 2021 przez cba Użytkownik (620 p.)
Dzięki wielkie za wyjaśnienie!

Nie znaleziono podobnych pytań

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...