关于Windows:CreateThread vs fork()

CreateThread vs fork()

fork()和CreateThread之间是否存在某种关系?有什么事吗
CreateThread内部调用fork()吗?


在NT中,基本工作单元称为线程(即NT调度线程,而不是进程)。用户线程在进程的上下文中运行。调用CreateThread时,您要求NT内核在您的进程上下文中分配一个工作单元(您也可以使用基本上是线程的纤维来安排自己的时间,但这超出了您的问题)。

当您调用CreateThread时,会为函数提供一个入口点,该入口点将在函数调用后运行。代码必须在流程的虚拟空间内,并且页面必须具有执行权限。简而言之,您可以提供一个函数指针。 ;)

fork()是UNIX函数,它请求内核创建正在运行的进程的副本。父进程获取子进程的pid,子进程获取0(这样您就知道自己是谁)。

如果要在Windows中创建进程,请调用CreateProcess函数,但是它的行为不像fork()。原因是大多数时候您将创建线程而不是进程。

如您所见,CreateThread和fork之间没有任何关系。


fork()仅在Unix系统上存在,它创建一个状态与调用者相同的新进程。 CreateThread()在同一进程中创建一个新线程。


您可能想知道Microsoft在Windows的高端版本中提供了fork()组件,该组件称为基于UNIX的应用程序(SUA)的子系统。您可以在我的答案中找到详细信息。


Windows和Unix流程模型本质上是非常不同的,因此无法直接将API彼此映射。

fork()将当前进程克隆为两个。在父进程中,fork()返回pid,在子进程中返回0。通常按以下方式使用:

1
2
3
4
5
6
int pid;
if (pid = fork()) {
    // this code is executed in the parent
} else {
    // this code is executed in the child
}

Cygwin是用于在Windows上构建和运行Unix应用程序的仿真层,它使用CreateProcess()仿真fork()的行为。


CreateThread-用于线程,fork-用于创建重复进程。而且,没有本机的方法来为Windows提供分叉功能(至少通过Win32)。


找到了这个链接,我认为这对清除有关分叉/线程处理的一些事实可能会有所帮助。
在此处共享:http://www.geekride.com/index.php/2010/01/fork-forking-vs-threading-thread-linux-kernel/