Как работает pthread? - PullRequest
       12

Как работает pthread?

20 голосов
/ 31 января 2011

У меня есть опыт многопоточного программирования на Java и C #, и я начинаю изучать, как это делать на C в Linux. Я «вырос» в смысле программирования на Linux, поэтому я понимаю, что это философия памяти, обработка процессов и т. Д. На высоком уровне.

Мой вопрос не в том, как делать потоки. Я хотел бы знать, как на самом деле это делает pthread. Это как-то разветвляет процесс и управляет вашим межпроцессным взаимодействием? Или он просто управляет адресным пространством? Я хочу мелкие детали :) Гуглинг выдает только вопросы "как это сделать", а не "как это работает".

Ответы [ 3 ]

13 голосов
/ 31 января 2011

Детали, вероятно, слишком сложны, чтобы в них реально разобраться (без публикации ссылки на исходный код glibc), но я могу дать вам лучшие вещи для поиска:

  1. Pthread использует sys_clone () для создания новых потоков, которые ядро ​​рассматривает как новую задачу, которая позволяет совместно использовать многие структуры данных с другими потоками.

  2. Для синхронизации pthread сильно зависит от futexes в ядре.

11 голосов
/ 31 января 2011

В Linux и fork(), и ptrheads используют один и тот же системный вызов clone(), который создает новый процесс.Разница между ними заключается просто в параметрах, которые они отправляют clone(), при создании нового потока он просто заставляет оба процесса использовать одинаковые отображения памяти.

Помните, что в Linux (и других современных Unixes) памятьотображения, стеки, состояние процессора, PID и другие являются ортогональными характеристиками процесса;так что вы можете создать новый процесс с новым стеком и состоянием процесса (делиться всем остальным) и назвать его потоком.

4 голосов
/ 31 января 2011

Здесь является источником pthread.c. Это может помочь вам ответить на ваш вопрос.

...