Newsgroup: it.comp.os.linux.development
Titolo: pid dei thread

Ciao,
sto seguendo il libro advanced linux programming, sono incartato alla
penultima pagina del capitolo 4 sui thread
 
teoricamente se ho capito bene se in un programma lancio 3 thread ognuno
di essi dovrebbe avere il proprio pid, lo stesso lo leggo dalla pagina man
http://linux.die.net/man/7/pthreads
 
 
peccato che il seguente esempio copiato tale e quale dal libro
mi riporta sempre lo stesso pid per i due thread
 
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
 
void* thread_function (void* arg) {
	fprintf (stderr, "child thread pid is %d\n", (int) getpid ());
	/* Spin forever. */
	while (1);
	return NULL;
}
 
int main (){
	pthread_t thread;
	fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
	pthread_create (&thread, NULL, &thread_function, NULL);
	/* Spin forever. */
	while (1);
	return 0;
}
 
main thread pid is 7297
child thread pid is 7297
^C
RUN FAILED (exit value 1, total time: 45s)
 
 
ho cercato con google, ma ho trovato solo qualcosa riguardo alla
funzione clone (che sia richiamata dalla create??) e al caching dei pid,
che puntano al sito 
kernel.org
 che e' ancora fermo...
 
e' cambiato lo standard POSIX?
grazie, ciao
 
 
-- 
Ciao!
Nobuteru
Jabber ID 
nobu...@jabber.org
 
Download free Jabber client from 
www.jabber.org
 

 
 
Se leggi meglio la man page su pthreads puoi vedere che thread diversi 
**condividono** lo stesso process ID (e tante altre cose, altrimenti i 
thread non avrebbero senso di esistere).
Diversi altri attributi invece sono thread specific.
 
 
Ciao  Manlio

 Ciao  Manlio
 
ok, guarda che c'e' scritto anche:
 
"[..] Threads do not share process IDs. (In effect, LinuxThreads threads
are implemented as processes which share more information than usual,
but which do not share a common process ID.) LinuxThreads threads
(including the manager thread) are visible as separate processes using
ps(1).
The LinuxThreads implementation deviates from the POSIX.1 specification
in a number of ways, including the following:
-
 
Calls to getpid(2) return a different value in each thread.
 
[..]"
 
Ho anche installato le manpages che mi mancavano e sono uguali a quelle
online, quindi non penso che siano superate.
 
 
Lo stesso concetto spiegato in advanced linux programming, che e'
online
(
http://www.advancedlinuxprogramming.com/alp-folder/alp-ch04-threads.pdf
) nella
penultima pagina del capitolo 4 riguardo ai thread.
Da quello che leggo,questo e' solo uno standard interpretato in Linux di
POSIX, che offre il vantaggio per esempio se si devono gestire i segnali
di inviarne uno, ad uno specifico thread (non c'e' in altri "unix").
so' che il libro e' datato, non so se e' ancora attuale riguardo a
questo o se hanno cambiato gli standard nel tempo.
Leggevo in internet di gente con il mio stesso problema, cioe' programmi
scritti con i threads che funzionavano su redhat 5, ma portati poi sulle
nuove versioni funzionavano cosi' riportando lo stesso processo padre
per tutti i threads generati, le risposto che ho trovate le ho scritte
nel primo post.
Sempre gli esempi online con i thread e la getpid() non mi funzionano
come a chi li ha messi online.
 
mi viene il dubbio che hanno cambiato gli standard per compatibilita' o
per altre ragioni sconosciute...


 Ciao  Manlio
 
ciao
lascia stare, ho risolto googleando un po' di piu':
 
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/syscall.h>
#include <unistd.h>
 
int errno;
 
void* f(void *arg) {
    printf("%u,%p, %u\n", getpid(), &errno, syscall(SYS_gettid));
    fflush(stdin);
    return NULL;
}
 
int main(int argc, char **argv) {
    pthread_t tid;
    pthread_create(&tid, NULL, f, NULL);
    printf("%u,%p, %u\n", getpid(), &errno, syscall(SYS_gettid));
    fflush(stdin);
    pthread_join(tid, NULL);
    return 0;
}
 
dandomi come risultato :
 
14042,0x804a034, 14042
14042,0x804a034, 14043
 
RUN SUCCESSFUL (total time: 225ms)
 
 
da quello che leggo e' qualcosa che riguarda la chiamata di sistema
clone(), studiero' e' indaghero'
 
"If CLONE_THREAD is set, the child is placed in the same thread group as
the calling process. To make the remainder of the discussion of
CLONE_THREAD more readable, the term "thread" is used to refer to the
processes within a thread group.
 
    Thread groups were a feature added in Linux 2.4 to support the POSIX
threads notion of a set of threads that share a single PID. Internally,
this shared PID is the so-called thread group identifier (TGID) for the
thread group. Since Linux 2.4, calls to getpid(2) return the TGID of the
caller."


 
trovato e' il caching spiegato qui...
http://yarchive.net/comp/linux/getpid_caching.html
 


 [...]
 
 
Ciao  Manlio

 [...]
 
 
Ciao  Manlio