Вызов форка в многопоточном процессе - PullRequest
0 голосов
/ 03 декабря 2018

У меня были сомнения по поводу использования fork в многопоточном процессе.Если у процесса есть несколько потоков (уже созданных с помощью pthread_create и pthread_join) и я вызываю fork, будет ли он копировать те же функции, которые назначены потокам в дочернем процессе, или создаст пространство, где мы можем переназначить функции?

1 Ответ

0 голосов
/ 03 декабря 2018

Внимательно прочитайте, что говорит POSIX о fork() и потоках.В частности:

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

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

Раздел обоснования (далее по связанной странице) гласит:

Есть две причины, по которым программисты POSIX вызывают fork().Одной из причин является создание нового потока управления в той же программе (что первоначально было возможно только в POSIX путем создания нового процесса);другой - создать новый процесс, на котором запущена другая программа.В последнем случае после вызова fork() вскоре следует вызов одной из exec функций.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...