2009-11-10 5 views
0

cela pourrait être une requête simple. Lorsque nous créons un thread nous passons le (void *) t comme argument à une fonction PrintHello. Nous copions la valeur dans le thread du pointeur (typacasting to long) dans tid qui est une variable longue à nouveau Je suis confondu avec le paramètre passant. est-ce un passage par référence ou passez par value.over tout est-ce correct? (value *)t. quelle valeur passe-t-elle exactement?requête sur un programme multithread

long t; 
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); 

void *PrintHello(void *threadid) 
{ 
    long tid; 
    tid = (long)threadid; 

s'il vous plaît aidez-moi à éviter ma confusion :(

Répondre

5

Ce que vous faites est de passer par la valeur. C'est bien aussi longtemps que sizeof(T) <= sizeof(void*) pour le type T vous essayez de passer.

Si ce n'est pas le cas, vous devriez créer un T sur le tas comme il pourrait être hors de portée lorsque le thread créé tente d'y accéder:

T* t = new T(someValue); 
rc = pthread_create(&threads[t], NULL, PrintHello, (void*)t); 
+0

Ceci est la bonne réponse. Dans ce cas, disons que vous voulez seulement passer une variable scalaire 32/64-bit, alors c'est sûr. La valeur est simplement copiée et vous pouvez lire en toute sécurité quelle que soit la fin de la fonction ou non. – minjang

0

Il devrait être transmis par référence.

Assurez-paramètre que u passer doit être soit globale ou allouée dynamiquement afin d'accéder en fonction de fil .

Vous r passant addresss donc écrire ce ....

rc = pthread_create (& fils [t], NUL L, PrintHello, (vide *) & t);

+0

https: //computing.llnl. gov/tutorials/pthreads/montre cet exemple. Cet exemple est-il incorrect? – Vijay

+0

L'exemple fonctionne correctement car le thread principal ne s'arrête pas avant les fils - mais c'est une hypothèse qui pourrait ne pas être vraie dans des scénarios plus complexes. Il est juste dangereux de simplement copier et coller dans toute situation ... – weismat

+0

la page web dit aussi que 'rc = pthread_create (& threads [t], NULL, PrintHello, (void *) &t);' est un moyen incorrect de passer les arguments mais pourquoi? – Vijay

Questions connexes