CreateThread vs fork()

时间:2009-03-06 14:26:17

标签: windows multithreading unix process

我们在fork()和CreateThread之间有什么关系吗?有什么吗? CreateThread在内部调用fork()?

6 个答案:

答案 0 :(得分:10)

在NT中,基本工作单元称为线程(即NT调度线程,而不是进程。)。用户线程在进程的上下文中运行。当你调用CreateThread时,你请求NT内核在你的进程的上下文中分配一个工作单元(你也有基本上可以安排线程的光纤,但这超出了你的问题主题)。

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

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

如果您希望在Windows中创建进程,请调用CreateProcess函数,但这不像fork()。原因是大多数时候你会创建线程,而不是进程。

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

CreateThread - 用于线程,fork - 用于创建重复进程。并且没有本地方法可以为Windows提供fork功能(至少通过Win32)。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

找到这个链接,我相信这可能有助于清除有关分叉/线程的一些事实。 在此分享:http://www.geekride.com/index.php/2010/01/fork-forking-vs-threading-thread-linux-kernel/