Comment pthread mis en œuvre dans le noyau linux 3.2?
tous,
Le code ci-dessous provient de "Avancées de la Programmation en Environnement Unix", il crée un nouveau thread, et imprime le processus d'id et l'id de thread principal et de nouveaux threads.
Dans le livre, il dit que sous linux, la sortie de ce code permettrait de montrer que deux threads différents
id de processus, parce que pthread utilise de processus léger à émuler fil. Mais quand j'ai couru ce code dans Ubuntu 12.04, il a noyau 3.2, imprimée la même pid.
oui, le nouveau noyau linux changer la mise en œuvre interne de pthread?
#include "apue.h"
#include <pthread.h>
pthread_t ntid;
void printids(const char *s) {
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x)\n",
s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid);
}
void *thread_fn(void* arg) {
printids("new thread: ");
return (void *)0;
}
int main(void) {
int err;
err = pthread_create(&ntid, NULL, thread_fn, NULL);
if (err != 0)
err_quit("can't create thread: %s\n", strerror(err));
printids("main thread: ");
sleep(1);
return 0;
}
- Voir aussi: stackoverflow.com/questions/5514464/...
- Wikipédia a un bon article sur le commutateur Linux faite pour NPTL dans le noyau 2.6: en.wikipedia.org/wiki/Native_POSIX_Thread_Library et un court article qui explique en partie les carences de l'ancien modèle de thread, LinuxThreads: en.wikipedia.org/wiki/LinuxThreads
Vous devez vous connecter pour publier un commentaire.
Sur Linux
pthread
utilise leclone
syscall avec un drapeau spécialCLONE_THREAD
.Voir le la documentation de
clone
syscall.Et en fait, Linux ne le changement de son fil de la mise en œuvre, depuis POSIX.1 exige threads partagent un même ID de processus.
Linux utilise généralement deux implémentations de pthreads: LinuxThreads et Native POSIX Thread Library(NPTL), bien que l'ancien est en grande partie obsolète. Noyau 2.6 fournit NPTL, qui fournit beaucoup plus proche de la conformité à SUSv3, et mieux surtout quand il y a de nombreux fils.
Vous pouvez interroger la mise en œuvre spécifique de pthreads en vertu de shell à l'aide de la commande:
getconf GNU_LIBPTHREAD_VERSION
Vous pouvez également obtenir une vue plus détaillée de la mise en œuvre de différence dans L'Interface De Programmation Linux.