PDA

Visualizza la versione completa : [C] pthread_self() valore strano


dekorus
23-06-2009, 18:38
Salve,
è possibile che un codice del tipo

int idthread = pthread_self();
printf("sono il thread %i\n", idthread);

mi restituisca

sono il thread -1219126384


cioè è normale un valore negativo???

Emulator ®
23-06-2009, 21:19
Ciao, questa funzione la richiami all'interno di un thread?

Inoltre ti consiglio di leggere: http://publib.boulder.ibm.com/iseries/v5r1/ic2924/index.htm?info/apis/users_28.htm

MacApp
24-06-2009, 02:30
Originariamente inviato da Emulator ®
Ciao, questa funzione la richiami all'interno di un thread?

no, la richiama fuori da un thread... ;-)

dekorus
24-06-2009, 12:42
Come faccio a richiamarla fuori da un thread???

scusami ma non ho capito la domanda...

YuYevon
24-06-2009, 14:13
pthread_self restituisce un valore di tipo pthread_t. Che io sappia tale tipo di dato è definito in maniera diversa a seconda delle implementazioni della libreria, tant'è ad esempio che per confrontare questi valori la libreria fornisce la funzione pthread_equal(), proprio perché il tipo pthread_t non è sempre lo stesso e con questa funzione è possibile "fregarsene" di quale sia il suo tipo primitivo, confrontando due valori di tipo pthread_t in qualsiasi modo esso sia definito (ovviamente perché cambia anche l'implementazione della funzione stessa).

In molte implementazioni, comunque, pthread_t è definito come unsigned long int, e anche sulla Slackware 12.2 che ho ora sottomano è così:



YuYevon@slackware:~$ cat /usr/include/bits/pthreadtypes.h | grep " pthread_t;"
typedef unsigned long int pthread_t;


quindi quel valore che hai stampato potrebbe essere appunto un "unsigned long int", solo che visto che hai usato il codice di formato %i (per gli interi con segno) ti ritrovi appunto un numero con il segno, che per caso è -. Il fatto è che in memoria non esistono numeri positivi o negativi, esistono solo dei bit (o per andare ancora più a basso livello "voltaggi diversi"), ed è il modo in cui chiediamo di farci stampare questi bit che stabilisce se un numero è negativo o positivo. Nella fattispecie di un intero negativo/positivo, il punto è che la rappresentazione binaria di un numero intero è in "segno e modulo", cioè il primo bit rappresenta il segno (convenzionalmente 1 sta per - e 0 per +) e gli altri 8-1, 16-1, 32-1 o 64-1 rappresentano il "modulo", ossia il valore numerico "assoluto" dal segno. Quindi se in memoria una variabile ha questa rappresentazione binaria (su 8 bit):

10010100

il primo 1 significherà un - davanti al numero se questo viene stampato come intero con segno, e un bit come tutti gli altri (il più significativo) se viene richiesta la stampa senza segno, quindi i risultati possibili sono -20 (con segno) e 148 (senza segno).

In conclusione, se usi %u come codice di formato ti ritroverai un intero senza segno...

Se non ricordo male, comunque, pthread_t può essere anche di tipo "puntatore a non-ricordo-cosa"... quindi nel dubbio controlla la definizione del tipo data nella libreria pthread che hai sul tuo sistema.

dekorus
06-07-2009, 18:18
n conclusione, se usi %u come codice di formato ti ritroverai un intero senza segno...

avevo cercato in giro e la solzuione che avevo trovato è praticamente la stessa

Grazie mille

Loading