2011-01-31 20 views
17

Mam doświadczenie w programowaniu wielowątkowym w Javie i C#, i zaczynam się uczyć, jak to zrobić w C na Linuksie. "Dorastałem" w sensie programowania w Linuksie, więc rozumiem, że jest to filofia pamięci, obsługa procesów itp. Na wysokim poziomie.Jak działa pthread?

Moje pytanie nie brzmi jak robić wątki. Chciałbym wiedzieć, jak naprawdę robi to pthread. Czy w jakiś sposób rozwidla proces i obsługuje komunikację międzyprocesową? A może po prostu zarządza przestrzenią adresową? Chcę drobnych szczegółów :) Googling stworzył tylko pytania "jak to zrobić", a nie "jak to działa".

Odpowiedz

9

W systemie Linux, zarówno fork() i ptrheads używać tego samego syscall clone(), który tworzy nowy proces. Różnica między nimi to po prostu parametry wysyłane do clone(), podczas tworzenia nowego wątku, po prostu sprawia, że ​​oba procesy używają tych samych mapowań pamięci.

Pamiętaj, że w Linuksie (i innych współczesnych Uniksach) odwzorowania pamięci, stosy, stan procesora, PIDy i inne są ortogonalnymi cechami procesu; więc możesz stworzyć nowy proces z nowym stosem i stanem procesu (dzielenie się wszystkim innym) i nazwać go wątkiem.

+2

Jest jeszcze jedna rzecz, której wątek nie może współdzielić - wartość 'TID'. – caf

4

Here jest źródłem pthread.c. Może to pomóc w udzieleniu odpowiedzi na twoje pytanie.

+0

Jest to implementacja systemu pthread dla systemu Windows, a nie implementacja systemu Linux. – Victor

12

Szczegóły są prawdopodobnie zbyt skomplikowane, aby rzeczywiście dostać się (bez zamieszczając link do kodu źródłowego glibc), ale mogę dać ci lepsze rzeczy do wyszukiwania:

  1. Pthread wykorzystuje sys_clone() aby utworzyć nowy wątków, które jądro widzi jako nowe zadanie, które dzieli wiele struktur danych z innymi wątkami.

  2. Aby wykonać synchronizację, pthread opiera się głównie na futexes w kernelu.

+0

+1: tylko dodanie, że 'fork()' używa tej samej syscall, ale nowe zadanie dzieli mniej struktur z rodzicem. – Javier

Powiązane problemy