我们在fork()和CreateThread之间有什么关系吗?有什么吗? CreateThread在内部调用fork()?
答案 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/