(Linux,C/C++) Wątki(pthread) - dwa wątki (+ main) - problem ze zwracaną wartością

0

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 <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/errno.h>

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);
}
0

Wprowadziłem parę stylistycznych poprawek, zobacz czy to pomoże — ale u mnie twoja wersja też działała.

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>

intptr_t thread_function(int tab[]) {
        int i;
        intptr_t suma = 0;
        for ( i=0; i<10; i++ ) {
                suma += tab[i];
        }
        return 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]);
                }
                
        intptr_t s1,s2;

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

        if ( pthread_join ( thread1,(void **) &s1) != 0 ) {
                printf("błąd przy kończeniu wątku 1.");
                abort();
        }
        
        if ( pthread_join ( thread2,(void **) &s2) != 0 ) {
                printf("błąd przy kończeniu wątku 2.");
                abort();
        }
        
        
        printf("---------------\n%6d | %d\n\nSuma: %d\n",s1,s2,s1+s2);

        return 0;
}

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