C - la Création de threads n
Je suis en train de travailler sur la fonction suivante. Cette fonction doit créer les n threads. Il doit aussi imprimer le tid de l'enfant thread. Mais pour le moment je suis peu confus. Quand j'ai de l'exécuter et de par exemple, j'ai créer 5 threads, il retourne tout le temps la même tid. Que j'ai compris le tid est le thread Id de l'appelant. En fait de même de l'appelant appeler tous ces threads ou ai-je quelque chose de mal.
Voici le code:
void spawnThreads( unsigned int n) {
int threads = n, ret = -1;
pthread_t * thread = malloc(sizeof(pthread_t)*threads);
pid_t tid;
int i;
for(i = 0; i < threads; i++) {
ret = pthread_creation(&thread[i], NULL, (void *(*)(void *)) foo, NULL); //foo does not do anything
if( ret != 0) {
printf("pthread error!\n");
}
tid = syscall(SYS_gettid);
printf("%d %d\n", i, tid);
printf("I just created thread %d\n", i);
pthread_join(thread[i],NULL);
}
void * foo(void) {
return NULL;
}
Par exemple, j'ai le pour la suite de l'entrée spawnThreads(4)
la sortie suivante:
0 2411
I just created thread 0
1 2411
I just created thread 1
2 2411
I just created thread 2
3 2411
I just created thread 3
Pour résumer, la fonction d'impression >i< >tid<. >tid< désigne le TID de l'enfant et >i< va de 1 à n.
Mais pourquoi dois-je obtenir quatre fois le même tid? Qu'ai-je fait de mal? Je vous serais reconnaissant, si quelqu'un pouvait m'expliquer ce qui s'est passé.
- Ce n'est pas votre code. Ref
pthread_creation
- Aussi:
(void *(*)(void *))
ce que la fonte?! - Vous êtes seulement l'appel
syscall(SYS_gettid)
de votre thread principal, pas les nouvelles discussions vous créez... - Je sais, mais j'ai dû le lire à plusieurs reprises. C'est juste plutôt LISPy.
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle vous obtenez le même TID pour chaque thread, c'est que vous êtes d'appel
syscall(SYS_gettid)
depuis le thread principal à chaque fois, plutôt que de partir dans le nouveau thread que vous créez. Vous avez besoin de l'appeler à partir de l'intérieur de votre fonction de thread, et ensuite fournir un moyen de transmettre les informations de retour pour le thread principal si c'est nécessaire.Comme un exemple d'une façon de le faire (certains vérification des erreurs omis):
Créer une structure pour tenir un mutex, l'état, le TID, et un drapeau pour indiquer quand le TID est valide.
Alors modifier la fonction de thread pour verrouiller, ensemble, et le signal (et déplacez-le de sorte qu'il est de déclaration est visible avant
spawnThreads()
):...et modifier votre
spawnThreads
fonction pour initialiser/nettoyage de la les membres de la structure et d'obtenir le TID une fois le fil définit:Ci-dessus, le mutex et l'état d'attente sont nécessaires pour s'assurer que le thread principal n'essayez pas d'imprimer le TID jusqu'à ce que le nouveau thread a eu la chance de le définir. Le thread principal débute un nouveau et puis attend, et le nouveau fil de signal quand c'est fait, le stockage de l'TID donc le thread principal peut continuer.
void *
il devrait donc être implicitement converti de toute façon... le casting ne devrait pas être nécessaire.Il y a trois morceaux de l'info, les gens sont généralement intéressés à: l'id du processus, l'id de thread et les pthreads id de thread. Tous les
pthread
appels sont autonomes en ce qu'ils utilisent sur leur propre id de thread. Id de processus et les os des id de thread peut être important pour des raisons hors de l'pthreads API.Pthread id sont signalés par
pthread_create
etpthread_self
, l'ancien rapports sur le fil il a créé et ce dernier, bien, lui-même. Autrement c'est de la poule et de l'œuf. Un thread ne peut pas demander à un autre thread que son id est, sauf si elle sait déjà ce que son id est. Si c'est un mécanisme, une liste mondiale, certains CIB, etc., doit être construit à l'accomplir.