Мне задали эти вопросы на собеседовании (собеседование по C++). Я не уверен в ответах и хотел бы узнать больше.
- Может ли поток создать другой поток?
- Может ли процесс создать другой процесс?
- Может ли поток создать процесс?
- Может ли процесс создать поток?
решение1
Да, поток может создать другой поток. В UNIX это делается (на низком уровне) через команду
clone()
, а на более высоком уровне, в кодировании на языке C, через библиотекуpthread
.Да, процесс может запустить другой процесс. Это происходит постоянно. Наиболее распространенный тип процесса -> процесс — через
fork()
.В этом я не уверен. На данный момент я хотел бы упомянуть, что есть два основных типа потоков: потоки уровня ядра и потоки уровня пользователя. Потоки уровня ядра (в целом) привязаны к основным процессам, в то время как потоки уровня пользователя порождаются этими процессами (то есть потоками уровня ядра).Есть исключения.Может быть, кто-то сможет дать лучший ответ на тему ветка -> процесс.
Да. См. комментарий в 3.
решение2
Любой исполняемый код может делать что угодно.
При этом процессы не являются кодом — потоки — это то, что фактически запускается, а процессы — это их окружающая среда. Следовательно, (1) и (3) истинны, остальное ложно.
решение3
Да для всех.
Это может помочь вам понять, что процессы на самом деле не "запускаются" в Windows. Запускаются потоки. Каждый процесс имеет по крайней мере один поток. Итак, настоящие вопросы:
- может ли выполнение кода создать другой поток? Да.
В Windows это делается с помощью API CreateThread или одного из его кузенов. Длинная версия будет выглядеть так: «может ли код, работающий в контексте потока, создать другой поток?» Конечно, но посколькувсекод выполняется в контексте некоторого потока, нет необходимости в дополнительных выражениях. CreateThread принимает аргумент, который является адресом функции, которая становится функцией верхнего уровня для нового потока — по сути, «главной» нового потока.
- может ли выполнение кода создать другой процесс? Да.
Аналогично предыдущему: когда вы работаете в контексте потока, вы также работаете в контексте процесса, которому принадлежит поток. Так что да, есть API CreateProcess, и вы можете использовать его для создания другого процесса.
Вы также автоматически и без дополнительных усилий создадите поток в вашем новом процессе... потому что (поскольку процессы не выполняются) процесс без потока ничего не может сделать. Этот первый поток в новом процессе начнет выполнять "главную" функцию программы - main() или WinMain() или что-то еще.