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