[Linux] [C / C ++] Mémo de vérification d'opération des variables locales fork, thread et thread

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.

référence

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

[Linux] [C / C ++] Mémo de vérification d'opération des variables locales fork, thread et thread
Variables globales et locales 2
Variables globales et locales 1
Vérifiez le type et la version de la distribution Linux
Commandes et fichiers pour vérifier la version de CentOS Linux
Vérification de l'installation et du fonctionnement de Django
Déclaration des variables globales du langage C
[Linux] [C / C ++] Obtenez tid (id du thread) / Wrap pthread_create pour obtenir le tid du thread enfant
Connaissance de base de Linux et des commandes de base
[Python] Mémo d'opération de pandas DataFrame
[Linux] Commandes d'opération de fichier et de répertoire
Mémo de fonctionnement de l'environnement virtuel Conda
Liste de vérification des compétences de Paiza des rangs D et C fréquemment utilisés ~ Python ~