Перезапуск потоков в разветвленном процессе - PullRequest
5 голосов
/ 06 июля 2011

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

Кто-нибудь имеет представление о том, как перезапустить потоки из их последнего состояния выполнения в разветвленном процессе.Для простоты можно предположить, что на момент разветвления не было приобретенных замков.Скажем, например, разветвление было сделано между двумя барьерами.

Ответы [ 3 ]

3 голосов
/ 06 июля 2011

Состояние выполнения потоков - это не только данные в стеке. Это также набор регистров процессора, который теряется.

do_fork() системный вызов, просто не копируйте другой поток из потока, который выполняет системный вызов do_fork -> copy_process , и существует единственный вызов copy_thread в строка 1181

retval = copy_thread(clone_flags, stack_start, stack_size, p, regs);
1 голос
/ 06 июля 2011

Угадай, что? У Solaris уже есть такая функция с именем forkall ! Хотелось бы увидеть его порт в Linux!

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

Полагаю, вы говорите о продолжениях . Я видел несколько обращений в Google (я попросил «продолжение c»), но я не могу рекомендовать какую-либо ссылку, так как я не знаю ваших конкретных потребностей.

...