【发布时间】:2009-03-06 14:26:16
【问题描述】:
我们在 fork() 和 CreateThread 之间有什么关系吗?有没有什么 CreateThread 内部调用 fork()?
【问题讨论】:
标签: windows multithreading unix process
我们在 fork() 和 CreateThread 之间有什么关系吗?有没有什么 CreateThread 内部调用 fork()?
【问题讨论】:
标签: windows multithreading unix process
在 NT 中,基本的工作单元称为线程(即 NT 调度线程,而不是进程。)。用户线程在进程的上下文中运行。当你调用 CreateThread 时,你请求 NT 内核在你的进程上下文中分配一个工作单元(你也有基本上是线程的纤程,你可以自己安排,但这超出了你的问题的主题)。
当您调用 CreateThread 时,您为函数提供了一个入口点,该入口点将在函数被调用后运行。代码必须在进程的虚拟空间内,页面必须有执行权限。简单地说,你给了一个函数指针。 ;)
fork() 是一个 UNIX 函数,它请求内核创建正在运行的进程的副本。父进程获取子进程的pid,子进程获取0(这样你就知道你是谁了)。
如果你想在 Windows 中创建一个进程,你可以调用 CreateProcess 函数,但它的行为不像 fork()。原因是大多数时候您将创建线程,而不是进程。
如您所见,CreateThread 和 fork 之间没有任何关系。
【讨论】:
fork() 仅存在于 Unix 系统上,它创建一个与调用者状态相同的新进程。 CreateThread() 在同一个进程中创建一个新线程。
【讨论】:
Windows 和 Unix 进程模型从根本上非常不同,因此无法直接将 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() 行为。
【讨论】:
CreateThread - 用于线程,fork - 用于创建重复进程。并且没有本地方法可以为 Windows 提供 fork 功能(至少通过 Win32 )。
【讨论】:
fork() 的示例实现。
您可能想知道 Microsoft 在高端版本的 Windows 中提供了 fork(),其中包含名为 基于 UNIX 的应用程序的子系统 (SUA) 的组件。您可以在我的回答here中找到详细信息。
【讨论】:
找到了这个链接,我相信它可能有助于清除一些关于分叉/线程的事实。 在这里分享:http://www.geekride.com/index.php/2010/01/fork-forking-vs-threading-thread-linux-kernel/
【讨论】: