我在面试(C++ 面试)中被问到这些问题。我对答案没有信心,想了解更多。
- 线程可以创建另一个线程吗?
- 进程可以创建另一个进程吗?
- 线程可以创建一个进程吗?
- 进程可以创建线程吗?
答案1
是的,一个线程可以创建另一个线程。在 UNIX 上,这是通过命令(在低级别)完成的
clone()
,而在高级别(在 C 语言中)则通过pthread
库完成。是的,一个进程可以启动另一个进程。这种情况经常发生。最常见的进程 -> 进程类型是通过
fork()
。这个我不确定。现在我想提一下,线程有两种主要类型:内核级线程和用户级线程。内核级线程(一般来说)与主要进程绑定,而用户级线程由这些进程生成(因此由内核级线程生成)。也有例外也许有人可以对线程->进程给出更好的答案。
是的。请参阅第 3 点中的评论。
答案2
任何执行的代码都可以做任何事情。
也就是说,进程不是代码——线程才是实际运行的东西,而进程是它们的封闭环境。因此 (1) 和 (3) 为真,其余为假。
答案3
全部同意。
这可能有助于您理解,进程实际上并没有在 Windows 中“运行”。线程运行。每个进程至少有一个线程。因此,真正的问题是:
- 执行代码可以创建另一个线程吗?可以。
在 Windows 上,这是通过 CreateThread API 或其同类之一完成的。长版本将是“在线程上下文中运行的代码可以创建另一个线程吗?”当然可以,但是由于全部代码在某个线程的上下文中运行,因此无需多言。CreateThread 接受一个参数,该参数是成为新线程的顶级函数的函数的地址 - 本质上是新线程的“主函数”。
- 执行代码可以创建另一个进程吗?是的。
与上文类似:当您在线程上下文中运行时,您也在拥有该线程的进程上下文中运行。因此,是的,有一个 CreateProcess API,您可以使用它来创建另一个进程。
您还将自动且无需进一步努力地在新进程中创建一个线程...因为(由于进程不运行)没有线程的进程无法执行任何操作。新进程中的第一个线程将开始运行程序的“主”函数 - main() 或 WinMain() 或其他。