Remarque sur la relation entre les variables locales fork, thread et thread
fourche et fil_local
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <thread>
static __thread int val = 0;
int main()
{
	int p_id;
	int status;
	int return_code = 0;
	printf("%d :Val de début du processus parent= %d\n", getpid(), val);
	val = 1000;
	auto th = std::thread([]{
			printf("%d :thread start val= %d\n", getpid(), val);
			val = 100;
			printf("%d :fin de filetage val= %d\n", getpid(), val);
			});
	if ((p_id = fork()) == 0) {
		/*Processus enfant*/
		printf("%d :Val de début de processus enfant= %d\n", getpid(), val);
		sleep(1);
		val = 200;
		printf("%d :Fin du processus enfant val= %d\n", getpid(), val);
	} else {
		/*Processus parent*/
		if (p_id == -1) {
			exit(EXIT_FAILURE);
		}
		wait(&status);
		printf("%d :Val de fin de processus parent= %d\n", getpid(), val);
	}
	th.join();
	return 0;
}
Créer et exécuter des résultats
$ g++ -std=c++11 fork_and_threadlocal.cpp -pthread
$ ./a.out
11217 :Val de début du processus parent= 0
11217 :thread start val= 0       //La valeur initiale est 0 au lieu de 1000
11217 :fin de filetage val= 100
11219 :Val de début de processus enfant= 1000  //Copiez la valeur dans le processus parent tel qu'il est lors de la fourche(Ou toujours partagé par COW?)A été
11219 :Fin du processus enfant val= 200
11217 :Val de fin de processus parent= 1000  //Insensible aux modifications des processus enfants
La variable thread_local n'est pas passée à son état initial (0 cette fois), ce qui n'est pas surprenant en raison des spécifications de fork.
Cependant, il semble que exec * soit généralement appelé après fork, donc il peut ne pas être pertinent lors de son utilisation réelle.
Man page of FORK fork - Wikipedia [Génération et nettoyage de processus de discussion technique (Linux C ++) - Page d'accueil de Tsubasa](http://www.himajin2001.com/fswiki/wiki.cgi?page=%B5%BB%BD%D1%C5% AA% BB% A8% C3% CC-% A5% D7% A5% ED% A5% BB% A5% B9% A4% CE% C0% B8% C0% AE% A4% C8% B8% E5% BB% CF % CB% F6 (Linux% 20C% 2B% 2B% CA% D4)) Coûts associés au changement de contexte multithread - Journal Hatena de Naoya
Recommended Posts