Ответ на этот вопрос, как и почти все остальное в C ++, звучит так: «это зависит».
Если предположить, что в программе есть другие потоки, и эти потоки синхронизируются друг с другом, вызывая fork
опасно. Это связано с тем, что fork
не ожидает, когда все потоки станут точкой синхронизации (то есть освобождение мьютекса) для разветвления процесса. В разветвленном процессе будет присутствовать только поток, вызвавший fork
, а остальные будут прерваны, возможно, в середине критической секции. Это означает, что любая память, совместно используемая другими потоками, которая не была std::atomic<int>
или подобной, является неопределенным состоянием.
Если ваш разветвленный процесс читает из этой памяти или действительно ожидает запуска других потоков, он, вероятно, не будет работать надежно. Однако большинство случаев использования fork
фактически не имеют предварительных условий для состояния программы . Это потому, что наиболее распространенная вещь - это немедленный вызов execv
или аналогичный, чтобы вызвать подпроцесс. В этом случае весь ваш процесс как бы «заменяется» каким-то новым процессом, и вся память вашего старого процесса отбрасывается.
tl; dr - вызов fork
может быть небезопаснымв многопоточных программах. Иногда это безопасно;например, если еще не появилось ни одного потока, или evecv
вызывается немедленно. Если вы используете fork
для чего-то другого, рассмотрите возможность использования темы.
См. справочную страницу и этого полезного блога для подробностей. .