Реализация многопоточной вилки - PullRequest
2 голосов
/ 04 июля 2011

Я пытаюсь проверить многопоточное приложение.Для однопоточных приложений разветвление процесса в качестве контрольной точки является эффективным методом.Тем не менее, нет такой вещи, как многопоточная вилка.Есть идеи, как реализовать свой собственный многопоточный форк?Любая ссылка на такую ​​работу будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 04 июля 2011

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

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

  2. с использованием vfork, за которым следует SIGSTOP, чтобы остановить родительский процесси дайте себе шанс воссоздать его состояние потока без каких-либо изменений под вас.Это кажется возможным, но достаточно трудным, я бы почувствовал головную боль, пытаясь углубиться в детали, я думаю ...

  3. (недавно добавлено) перехватывает каждый поток в обработчиках сигналов перед разветвлением и сохраняетucontext_t аргумент обработчику сигнала.Затем выполните разветвление и создайте новые потоки ядра (используя clone), попросите их сигнализировать себя, а затем перезаписать обработчик сигнала ucontext_t, чтобы обработчик сигнала вернулся обратно в контекст исходного потока, который вы пытаетесь продублировать.Конечно, все это потребовало бы очень умной синхронизации ...

В качестве альтернативы, вы могли бы искать основанный на ядре подход "спящего режима" к контрольным точкам, который не был бы таким хакерским ...

0 голосов
/ 04 июля 2011

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

Последнее невозможно, так как адресное пространство используется совместно.Копия состояния текущего потока будет использовать стек текущего потока, а новый поток и старый поток будут бороться за стек.

См. Также:

...