Другие потоки в текущем процессе не уничтожаются вилкой - они все еще там и работают в родительском. Кажется, проблема в том, что fork
разветвляет только ОДИН поток в текущих процессах, создавая новый процесс, запускающий один поток, с копией всех ресурсов, не относящихся к потокам, в родительском объекте.
То, что вы, очевидно, хотите, это способ дублирования всей многопоточной задачи, разветвления всех потоков в ней и создания нового процесса / задачи с тем же числом потоков.
Чтобы сделать ЭТО, вам нужно будет найти и приостановить все остальные потоки в процессе, сбросить их текущее состояние (включая все блокировки, которые они удерживают), разветвить новый процесс, а затем (заново) создать каждый из них. другие потоки в дочернем процессе, переназначая состояние блокировки для ссылки на новые дочерние потоки, где это необходимо.
К сожалению, pthread-интерфейс POSIX безнадежно недооценен и не позволяет этого сделать. В частности, в нем отсутствует какой-либо отражающий интерфейс, позволяющий выяснить, какие потоки действительно выполняются.
Если вы все равно хотите попытаться сделать это, я вижу два способа попытаться подойти к этому:
покопайтесь в / proc / self / task, чтобы выяснить, какие потоки выполняются в вашем процессе, эффективно получая этот отражающий интерфейс в очень непереносимой форме. Скорее всего, вам придется в конечном итоге выполнить ptrace (2) для других потоков, чтобы получить их внутреннее состояние. Это будет очень сложно.
оберните библиотеку pthreads - вместо непосредственного использования библиотеки перехватывайте каждый вызов и отслеживайте все созданные потоки / мьютексы / блокировки, чтобы иметь эту информацию доступной, когда вы хотите выполнить форк. Это будет работать нормально, если вы не хотите использовать сторонние библиотеки, использующие pthreads
Второй вариант намного проще (и несколько переносим), но работает хорошо, только если у вас есть доступ ко всему исходному коду всего вашего приложения, и вы можете изменить его для правильного использования ваших оболочек.