Discussione:
Aiuto sull' utilizzo dei Pthread e sul linguaggio in generale
(troppo vecchio per rispondere)
c***@gmail.com
2014-09-22 12:35:48 UTC
Permalink
Salve ragazzi,
Ho spulciato un po' il forum ed ho visto che c'è stata una diattriba sull' evoluzione dei linguaggi in questi ultimi anni.. Io personalmente negli ultimi anni ho perso la mano con il c avendolo soppiantato per linguaggi interpretati di alto livello che mi hanno "abituato bene"... Ma cè poco da fare.. quando servono performance e controllo su come vengono gestite le cose bisogna fare un passo indietro...

Veniamo a noi..
Devo usare i Posix Thread in c e mi sono bloccato su un esempio di codice..
Mi aiutate?

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

struct arg {
int a, b;
int *rst;
};
typedef struct arg arg;

void* sum(void *);

int main()
{
pthread_t sum1, sum2;
int s1, s2;
pthread_create(&sum1, NULL, sum, &(arg){1, 500000000, &s1});
pthread_create(&sum2, NULL, sum, &(arg){500000001, 1000000000, &s2});
pthread_join(sum1, NULL);
pthread_join(sum2, NULL);
printf("%d\n", s1 + s2);
}

void* sum(void *ptr)
{
int i, temp = 0;
arg *x = ptr;

for(i = x->a; i <= x->b; ++i)
temp += i;
*(x->rst) = temp;
}

La cosa che non capisco è :
quando inizializza il tipo definito arg passo &(arg){1, 500000000, &s1} ossia passo l'indirizzo di arg alla funzione che crea il thread.

Successivamente creo un altro thread : pthread_create(&sum2, NULL, sum, &(arg){500000001, 1000000000, &s2}); e ripasso l'indirizzo della stesso tipo definito sovrascrivendo i campi.

Ma i thread a differenza dei processi condividono le variabili globali!!!
Questo esempio trovato su stack overflow è sbagliato?
Grazie mille.
Giacomo Degli Esposti
2014-09-22 13:12:57 UTC
Permalink
Post by c***@gmail.com
quando inizializza il tipo definito arg passo &(arg){1, 500000000, &s1} ossia passo l'indirizzo di arg alla funzione che crea il thread.
Successivamente creo un altro thread : pthread_create(&sum2, NULL, sum, &(arg){500000001, 1000000000, &s2}); e ripasso l'indirizzo della stesso tipo definito sovrascrivendo i campi.
No, attenzione: e' come se tu avesi definito due *variabili temporaenee* entrambe di tipo arg e passi alla funzione i due indirizzi delle due variabili, che rimangono quindi separati in memoria.

ciao
Giacomo
c***@gmail.com
2014-09-22 14:21:33 UTC
Permalink
Post by Giacomo Degli Esposti
Post by c***@gmail.com
quando inizializza il tipo definito arg passo &(arg){1, 500000000, &s1} ossia passo l'indirizzo di arg alla funzione che crea il thread.
Successivamente creo un altro thread : pthread_create(&sum2, NULL, sum, &(arg){500000001, 1000000000, &s2}); e ripasso l'indirizzo della stesso tipo definito sovrascrivendo i campi.
No, attenzione: e' come se tu avesi definito due *variabili temporaenee* entrambe di tipo arg e passi alla funzione i due indirizzi delle due variabili, che rimangono quindi separati in memoria.
ciao
Giacomo
Grazie mille per la risposta,
ora mi è più chiaro, mi sorge però un dubbio..
Questo è uno strano comportamento perchè io passo un puntatore ad una struttura, quindi per riferimento. Come fa tale tipo definito a "duplicarsi"?
Giacomo Degli Esposti
2014-09-22 14:45:51 UTC
Permalink
Post by c***@gmail.com
Grazie mille per la risposta,
ora mi è più chiaro, mi sorge però un dubbio..
Questo è uno strano comportamento perchè io passo un puntatore ad una struttura, quindi per riferimento. Come fa tale tipo definito a "duplicarsi"?
Non e' il tipo che "si duplica", seplicemente vengono istanziate
due variabili dello stesso tipo. :)

Quello che accade e' piu' o meno una cosa del genere:

arg a1;
arg a2;

a1 = (arg){ 1, 500000000, &s1 };
a2 = (arg){ 500000001, 1000000000, &s2 };

pthread_create( ..., &a1 );
pthread_create( ..., &a2 );

come vedi ci sono due variabili. Ogni thread lavora su una delle due
quindi lavorando su due aree diverse non occorre sincronizzazione.

ciao
Giacomo

Loading...