Pthread и дочерний процесс обмена данными в C - PullRequest
4 голосов
/ 03 апреля 2010

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 03 апреля 2010

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

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

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

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

2 голосов
/ 03 апреля 2010

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

1 голос
/ 03 апреля 2010

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

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

...