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