【问题标题】:CreateThread vs fork()CreateThread 与 fork()
【发布时间】:2009-03-06 14:26:16
【问题描述】:

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

【问题讨论】:

    标签: windows multithreading unix process


    【解决方案1】:

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

    当您调用 CreateThread 时,您为函数提供了一个入口点,该入口点将在函数被调用后运行。代码必须在进程的虚拟空间内,页面必须有执行权限。简单地说,你给了一个函数指针。 ;)

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

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

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

    【讨论】:

    • 如果你想在 Windows 中创建一个进程,你可以调用 CreateProcess 函数,但它的行为不像 fork()。原因是大多数时候您将创建线程,而不是进程。使用哪一个是两者之间差异的结果而不是原因:)
    【解决方案2】:

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

    【讨论】:

    • Windows NT、2000 等确实支持 posix,因此也支持 fork robelle.com/smugbook/process.html
    • 哇。为什么 MSDN 中没有提到?
    • 这里提到了support.microsoft.com/kb/149902。虽然它看起来像是在winXP中默认取出的(我已经有一段时间没有在windows上c'ed了)support.microsoft.com/kb/308259
    • @David Waters 虽然在winXP中看起来是默认取出来的 是什么让你这么认为?在您提供的链接 (support.microsoft.com/kb/308259) 中,有这样的声明 POSIX 子系统已被替换为 更像 UNIX 的名为 Windows Services for UNIX 的环境。不要认为它意味着不再有 fork() 实现。事实上,在 C 中移植应用程序(UNIX 3.0 技术说明的服务)的 Summary of Interfaces 部分中,fork() 作为支持的调用存在...
    【解决方案3】:

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

    【讨论】:

    • 我相信你把块标记错了,因为 child 进程得到 0,而父进程得到子进程的 PID。
    • 好的,谢谢。现在修好了。 (令人印象深刻的是,这一点在一年多的时间里都没有引起人们的注意。)
    【解决方案4】:

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

    【讨论】:

    • 没有原生方式是一种尴尬的方式,因为正是 NT Native API 允许这样做。猜猜以前的 POSIX 子系统和现在的 SFU/SUA 是如何实现的 ;) ...查看 Nebbett 的“Windows NT/2000 Native API”一书,它包含了 fork() 的示例实现。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 2021-12-04
        • 2021-01-13
        • 1970-01-01
        相关资源
        最近更新 更多