PDA

View Full Version : dubbio pthread


zzzzzz
11-01-2006, 11:33
ciao a tutti!!!!
ho un dubbio sulla pthread_join.....il fatto è che ho il seguente frammento di codice all'interno del mio programma, che crea N thread, gli fa richiamare una funzione che li blocca tutti fino a quando non sono arrivati tutti gli altri, li sveglia tutti e poi ritorna....solo che non capisco una cosa..nel seguente pezzo di codice (che funziona nell'ambito del programma) c'è solo una pthread_join....in questo caso non dovrebbe attendere un solo thread invece di attenderli tutti??non dovrei fare N pthread_join per tutti i thread, per avere il risultato di aspettarli tutti???o funziona facendone 1 per il fatto che i thread vengono bloccati tutti fino a quando non è arrivato l'ultimo????


for(i=0;i<N;i++)
pthread_create(&thr,NULL,start_routine,(void *) y); // crea N thread
e li manda a start_rountine
pthread_join(thr,&ris); // sospende il thread chiamante fino alla
terminazione di thr e memorizza il valore di ritorno di thr in ris


grazie!!!

kingv
14-01-2006, 18:47
hai ragione, dovresti chiamare pthread_join una volta per ogni thread ma il tuo codice chiama pthread_create sempre sullo stesso thread.

zzzzzz
16-01-2006, 17:31
e quindi dovrei richiamare pthread_join tante volte quanti sono i thread anche nel caso in cui i thread si blocchino tutti fino all'arrivo dell'ultimo e poi ripartano insieme o, in questo caso, ne basta solo 1 alla fine???
perchè questo mi serve nell'ambito della realizzazione del meccanismo della barriera....

grazie.... :confused:

ilsensine
16-01-2006, 17:41
Per tua informazione pthread_join andrebbe chiamato sempre da qualche parte nel programma; quando un thread termina diviene una sorta di zombie, occupando ancora qualche residua risorsa, fino a quando non fai il join. I thread "detached" si comportano in maniera opposta (liberano immediatamente tutte le risorse all'uscita, ma non puoi effettuare un join su di essi).

A parte questo, pthread_join serve ad essere certi che un certo thread ha ultimato la sua esecuzione (ed eventualmente a prenderne il valore di ritorno). Quindi se il tuo problema è essere certo che tutti i thread hanno finito, bè sì devi eseguire pthread_join per tutti. Altrimenti spiega meglio cosa devi fare che forse mi sfugge qualcosa...