2009-07-02 20 views
9

Czy w systemie linux proces potomny wyświetla istniejące wątki w ten sam sposób, co proces nadrzędny?widelec i istniejące wątki?

int main() { 

    //create thread 1 

    int child_pid = fork(); 

    if (0 == child_pid) 
    { 
     .. 
    } 
    else 
    { 
     .. 
    } 

Ponieważ cała przestrzeń adresowa jest kopiowana do procesu potomnego, co dzieje się ze stanem wątków. Co jeśli wątek 1 w powyższym segmencie czeka na sygnał warunkowy. Czy jest również w stanie oczekiwania w procesie potomnym?

Odpowiedz

0

Wątki nie są dziedziczone po procesie potomnym w systemie Linux za pomocą fork(). Wyczerpujące źródło informacji znajduje się tutaj: http://linas.org/linux/threads-faq.html

+2

To często zadawane pytania są bardzo nieaktualne. Największą różnicą widoczną dla użytkownika jest to, że LinuxTreads został zdezaktualizowany przez NPTL od czasu wydania jądra 2.6 i glibc 2.3, który rozwiązuje wszystkie nierozstrzygnięte problemy związane z wątkami nie podobnymi do POSIX-owych. – ephemient

13

Wątki na Linuksie w dzisiejszych czasach starają się pozostać w zgodności z posix. Tylko nitka nazywając są replikowane, a nie innych wątków (zauważ, że np Solaris możesz wybrać co widelec nie w zależności od tego, co biblioteka link do)

Od http://www.opengroup.org/onlinepubs/000095399/functions/fork.html:

Proces powinien zostać utworzony z jeden wątek. Jeśli wielowątkowy proces wywołuje fork(), nowy proces będzie zawierał replikę wywołującego wątku i jego całej przestrzeni adresowej, , w miarę możliwości włączając stany muteksów i inne zasoby. W związku z tym, aby uniknąć błędów, proces potomny może wykonywać tylko operacje asynchroniczne z sygnałem asynchronicznym do , gdy wywoływana jest jedna z funkcji exec. Widły mogą być utworzone za pomocą funkcji funkcji pthread_atfork() w , aby utrzymać aplikację niezmienników w wywołaniach fork().

+1

Dzięki. Link jest bardzo pomocny. – Mac13