Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Wątki - dwa wątki (+ main) - problem ze zwracaną wartością  (Przeczytany 3774 razy)

sCk

  • Gość
Witam,
mama problem z wątkami, chce aby dwa utworzone watki liczyły sume elementów w wierszach tablicy, a nastepnie watek głowny dodawał te dwie sumy. Mam prawie wszystko zrobione jednak, pojawia sie pewien problem. Gdy ustawiam zeby tylko jeden watek liczyl sume swojego wiersza, wszystko elegancko działa. Jednak gdy dodaje drugi wątek, to wtedy ten drugi ładnie zwraca sume, ale ten pierwszy zwraca zawsze 0(chociaz raczej po prostu nic nie zwraca). Dzieje się tak gdy jest taka kolejność funkcji:
   phtread_create(thread1,...);
   phtread_create(thread2,...);

   phtread_join(thread1,...);
   phtread_join(thread2,...);

wszystko działa dobrze, gdy zmienie wywołania join miejscami:
   phtread_join(thread2,...);
   phtread_join(thread1,...);

W związku z tym wszystkim mam prośbe, niech ktoś kto wie dlaczego tak sie dzieje, wyjaśni to.

Dla lepszego wglądu wklejam kod:
#include 
#include
#include
#include
#include
#include

void *thread_function(void *arg) {
int *tab = (int *)arg;
int i,suma = 0;
for ( i=0; i<10; i++ ) {
suma += *(tab+i);
}
pthread_exit((void *)suma);
}

int main(void) {

pthread_t thread1,thread2;
int i;

int tab[2][10];

srand(time(NULL));
printf("tab[0] | tab[1] \\n");
for( i=0 ; i<10 ; i++ ) {
tab[0][i] = rand() % 20;
tab[1][i] = rand() % 20;
printf("%6d | %d \\n",tab[0][i],tab[1][i]);
}

int s1,s2;

if ( pthread_create( &thread1, NULL, thread_function, (void *)tab) ) {
printf("błąd przy tworzeniu wątku 1.");
abort();
}
if ( pthread_create( &thread2, NULL, thread_function, (void *)tab[1]) ) {
printf("błąd przy tworzeniu wątku 2.");
abort();
}

if ( pthread_join ( thread1,(void **) &s1) ) {
printf("błąd przy kończeniu wątku 1.");
abort();
}
if ( pthread_join ( thread2,(void **) &s2) ) {
printf("błąd przy kończeniu wątku 2.");
abort();
}


printf("---------------\\n%6d | %d\\n\\nSuma: %d",s1,s2,s1+s2);

exit(0);
}

jk33

  • Gość
Wątki - dwa wątki (+ main) - problem ze zwracaną wartością
« Odpowiedź #1 dnia: 2010-12-20, 21:31:25 »
wskazówki:

Czy nie wyświetla CI się czasem warning kompilatora?
Rzutowanie intów na wskaźniki i vice-versa jest fajne tak długo jak długo oba typy mają tyle samo bajtów.
[Inaczej: nie jest to dobry pomysł, gdyż zmiana platformy może spowodować niedziałanie programu]

Zobacz jakie adresy w pamięci mają s1 i s2,
Porównaj działanie programu w środowisku 32 bit i 64 bit.

pozdrawiam, Janek