CreateThread与fork()的区别

5

我们是否在fork()和CreateThread之间有任何关系?CreateThread内部是否会调用fork()?

6个回答

10
在NT系统中,最基本的工作单位被称为线程(即NT调度线程,而不是进程)。用户线程在进程的上下文中运行。当您调用CreateThread时,您请求NT内核在您的进程上下文中分配一个工作单元(您还有纤程,它们基本上是您可以自己调度的线程,但这超出了您提问的主题)。
当您调用CreateThread时,您向函数提供一个入口点,该入口点将在调用函数后运行。代码必须在进程的虚拟空间内,并且页面必须具有执行权限。简而言之,您提供了一个函数指针。 ;)
fork()是一个UNIX函数,请求内核创建正在运行的进程的副本。父进程获得子进程的pid,子进程获得0(这样您就知道自己是谁)。
如果您想在Windows中创建一个进程,可以调用CreateProcess函数,但它的行为不像fork()。原因是大多数情况下,您将创建线程,而不是进程。
正如您所看到的,CreateThread和fork之间没有关系。

2
如果您想在Windows中创建一个进程,可以调用CreateProcess函数,但它的行为不像fork()。原因是大多数情况下,您将创建线程而不是进程。使用哪种方法是两者之间差异的后果,而不是原因 :) - Piotr Dobrogost

5

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


2
Windows NT、2000等操作系统支持POSIX,因此也支持fork。http://www.robelle.com/smugbook/process.html - David Waters
哇,为什么MSDN上没有提到呢? - sharptooth
请参阅http://support.microsoft.com/kb/149902。尽管看起来在WinXP中默认已删除(自我最后一次在Windows上编程以来已经有一段时间了),但请参阅http://support.microsoft.com/kb/308259。 - David Waters
1
@David Waters 虽然看起来在winXP中默认已删除 你是怎么想到的?在你提供的链接(http://support.microsoft.com/kb/308259)中有这样一句话 POSIX子系统已被替换为更类似UNIX的环境,称为Windows Services for UNIX。 我不认为这意味着不再有fork()实现。事实上,在C语言应用程序移植(Services for UNIX 3.0技术说明)的接口摘要部分中,fork()作为支持的调用出现了... - Piotr Dobrogost

2

Windows和Unix的进程模型根本上是非常不同的,因此没有直接将一个API映射到另一个API的方法。

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

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()的行为。


1
我相信你标记块的方式有误,因为子进程得到了0,而父进程得到了子进程的PID。 - Jeremy Salwen
是的,谢谢。现在已经修复了。(令人印象深刻,这个问题竟然被忽视了一年多。) - JesperE

1

你可能想知道,微软在高端版本的Windows中提供了名为基于UNIX应用程序子系统(SUA)的组件,其中包括fork()函数。你可以在我的答案这里找到详细信息。


1

CreateThread - 用于线程,fork - 用于创建重复进程。在Windows中没有本地的方法来实现fork功能(至少通过Win32不行)。


1
“没有本地方式”这种说法有些别扭,因为正是NT本地API实现了这一点。猜猜前POSIX子系统和现在的SFU/SUA是如何实现的 ;) … 请查看Nebbett的书《Windows NT/2000 Native API》,其中包括fork()的示例实现。 - 0xC0000022L

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接