[Linux] [C / C ++] Operation prüft Memo von Fork, Thread und Thread-lokalen Variablen

Hinweis zur Beziehung zwischen Fork, Thread und Thread-lokalen Variablen

Gabel und Gewinde_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 :Startwert des übergeordneten Prozesses val= %d\n", getpid(), val);

	val = 1000;

	auto th = std::thread([]{
			printf("%d :Gewindestart val= %d\n", getpid(), val);
			val = 100;
			printf("%d :Gewindeende val= %d\n", getpid(), val);
			});

	if ((p_id = fork()) == 0) {
		/*Untergeordneter Prozess*/
		printf("%d :Untergeordneter Prozessstart val= %d\n", getpid(), val);
		sleep(1);
		val = 200;
		printf("%d :Untergeordneten Prozess beenden val= %d\n", getpid(), val);
	} else {
		/*Übergeordneter Prozess*/
		if (p_id == -1) {
			exit(EXIT_FAILURE);
		}

		wait(&status);
		printf("%d :Val= %d\n", getpid(), val);
	}

	th.join();

	return 0;
}

Ergebnisse erstellen und ausführen


$ g++ -std=c++11 fork_and_threadlocal.cpp -pthread
$ ./a.out
11217 :Startwert des übergeordneten Prozesses val= 0
11217 :Gewindestart val= 0       //Der Anfangswert ist 0 statt 1000
11217 :Gewindeende val= 100
11219 :Untergeordneter Prozessstart val= 1000  //Kopieren Sie den Wert im übergeordneten Prozess so, wie er beim Gabeln ist(Oder noch von COW geteilt?)Ist gewesen
11219 :Untergeordneten Prozess beenden val= 200
11217 :Val= 1000  //Unberührt von Änderungen in untergeordneten Prozessen

Die Variable thread_local ist nicht in ihren Ausgangszustand übergegangen (diesmal 0), was aufgrund der Spezifikationen von "fork" nicht überraschend ist. Es scheint jedoch, dass exec * normalerweise nach fork aufgerufen wird, sodass es möglicherweise nicht relevant ist, wenn es tatsächlich verwendet wird.

Referenz

Man page of FORK fork - Wikipedia [Generierung und Bereinigung von technischen Chat-Prozessen (Linux C ++) - Tsubasas HomePage](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)) Kosten im Zusammenhang mit Multithread-Kontextwechsel --naoyas Hatena-Tagebuch

Recommended Posts

[Linux] [C / C ++] Operation prüft Memo von Fork, Thread und Thread-lokalen Variablen
Globale und lokale Variablen 2
Globale und lokale Variablen 1
Überprüfen Sie den Linux-Verteilungstyp und die Version
Befehle und Dateien zum Überprüfen der Version von CentOS Linux
Django Installation und Funktionsprüfung
Deklaration globaler Variablen der C-Sprache
[Linux] [C / C ++] Get tid (Thread-ID) / Wrap pthread_create, um tid des untergeordneten Threads abzurufen
Grundkenntnisse in Linux und Grundbefehle
[Python] Operationsnotiz von Pandas DataFrame
[Linux] Datei- und Verzeichnisoperationsbefehle
Betriebsnotiz der virtuellen Conda-Umgebung
Paiza Skill Checkliste der häufig verwendeten D- und C-Ränge ~ Python ~