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.
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