Деятельность данных Phread и детей в C
-
24-09-2019 - |
Вопрос
Мой вопрос несколько концептуальный, как данные родительского процесса совместно используются с дочерним процессом, созданным fork()
Позвоните или с потоком, созданной pthread_create()
Например, являются глобальными переменными, непосредственно переданными в детский процесс, и, если это так, делает модификацию на эту переменную, выполненную значением эффекта ребенка в родительском процессе?
Я ценю частичные и полные ответы заранее, если мне пропущу любой существующий ресурс, извините, я сделал несколько поисков в Google, но не смог найти хорошие результаты
Спасибо снова за ваше время и ответы
Решение
Семантика вилки () и Pthread_create () немного отличаются.
FORK () создаст новый процесс, где глобальные переменные будут разделяться между родителем и детьми. Большинство реализаций ОС будут использовать семантику для копирования в записи, что означает, что как родительский, так и дочерний процесс будет использовать те же страницы физической памяти для всех глобальных переменных до тех пор, пока один из процессов не пытается редактировать физическую память, в которой точка копия этого Страница сделана, так что теперь каждый процесс получает свою собственную копию и не видит другой процесс, так что процессы изолированы.
Pthread_Create () С другой стороны, создает новую тему в том же процессе. Новая тема будет иметь отдельное пространство стека от других текущих потоков того же процесса, однако глобальные переменные и пространство кучи совместно используются между всеми потоками того же процесса. Вот почему вам часто нужен Mutex для координации доступа к общему количеству памяти между несколькими потоками того же процесса.
TL; DR версия: с вилкой (), вы не видите изменения другого парня; с pthread_create () вы делаете.
Другие советы
Вилка создает почти точную копию процесса вызова, включая память и дескрипторы файлов. Глобальные переменные скопированы вместе со всем остальным, но они никак не связаны с родительским процессом. Поскольку файловые дескрипторы также копируются, родитель и ребенок могут взаимодействовать через них (до тех пор, пока они установлены правильно, обычно через трубу или SocketPair).
Существует большая разница между процессами, созданными fork
и между потоками, созданными с pthread_create
. Отказ Процессы не разделяют глобальные переменные и должны общаться через трубы, розетки или другие инструменты, предоставленные ОС. Хорошим решением MPI - это библиотека передачи сообщений для межпроцессной связи.
Темы совсем разные. Нить, созданная с pthread_create
Разделяет все глобальные переменные со своим абонентом. Кроме того, вызывающий абонент может передавать произвольную структуру в нить, и эта структура также будет передана. Это означает, что человек должен быть чрезвычайно осторожен при программировании потоками - такое количество обмена опасна и ошибка. То pthread
API обеспечивает мюметексы и условия для прочной синхронизации между потоками (хотя она все еще требует практики и опыта для правильной реализации).