2010-04-03 4 views
4

мой вопрос несколько концептуальных, как данные родительского процесса совместно с дочерним процессом, созданного fork() вызова или с резьбой, созданной pthread_create()потоковой и обмен данными дочернего процесса в C

, например, глобальные переменные напрямую передается в дочерний процесс, и если да, то модификация на эту переменную производится с помощью значения эффекта дочернего процесса в родительском процессе?

я ценю частичные и полные ответы заранее, если я не хватает какой-либо существующий ресурс, я извиняюсь, я сделал некоторые поиск на Google, но не смогли найти хорошие результаты

еще раз спасибо за ваш время и ответы

ответ

5

Семантика fork() и pthread_create() несколько отличается.

fork() создаст новый процесс, в котором глобальные переменные будут разделены между родительским и дочерним. Большинство реализаций ОС будут использовать семантику copy-on-write, что означает, что как родительский, так и дочерний процесс будут использовать одни и те же страницы физической памяти для всех глобальных переменных, пока один из процессов не попытается отредактировать физическую память, после чего копия этого страница, так что теперь каждый процесс получает свою собственную копию и не видит другого процесса, так что процессы изолированы.

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

TL; DR версия: с fork() вы не видите изменений другого парня; с pthread_create() вы делаете.

2

Форк создает почти точную копию вызывающего процесса, включая дескрипторы памяти и файла. Глобальные переменные копируются вместе со всем остальным, но они никоим образом не связаны с родительским процессом. Так как файловые дескрипторы также скопированы, родительский и дочерний могут взаимодействовать через них (пока они правильно настроены, обычно через трубку или гнездовую пару).

+0

Как насчет этого случая, у меня есть int * в родительском процессе, когда он разветвляется, он указывает где-то как адрес 5, детская копия будет указывать на одно и то же место справа? и модификация вступает в силу и в родительском процессе. – besamelsosu

+0

№. Все копии памяти копируются. Неважно, является ли это переменной или какой-то нераскрытой частью памяти. –

1

Существует большая разница между процессами, созданными fork, и между потоками, созданными с помощью pthread_create. Процессы не используют глобальные переменные и должны взаимодействовать через каналы, сокеты или другие инструменты, предоставляемые ОС. Хорошим решением является MPI - это библиотека передачи сообщений для взаимодействия между процессами.

Резьбы разные. Поток, созданный с помощью pthread_create, делится всеми глобальными переменными с его вызывающим абонентом. Более того, вызывающий может передать произвольную структуру в поток, и эта структура также будет совместно использоваться. Это означает, что при программировании с потоками нужно быть очень осторожным - такие количества совместного использования опасны и подвержены ошибкам. API pthread предоставляет мьютексы и условия для надежной синхронизации между потоками (хотя для правильной реализации все еще требуется практика и опыт).