【问题标题】:Process and Thread进程和线程
【发布时间】:2010-09-15 16:29:13
【问题描述】:

Process 和 Thread 不会共享哪些数据?

提前感谢所有提供时间的人

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

    在操作系统理论中(AFAIK 这适用于 Windows、Linux、*BSD 等操作系统)进程被定义为具有自己的页表的线程,即它的自己的虚拟内存空间。

    其他任何东西都取决于操作系统(文件描述符、套接字等)。根据我的经验,此类线程属性通常使用复制进程的标准系统调用来复制。想想看,它更容易实现,也更有资源(少管闲事,保持非虚拟内存不碰它)。

    【讨论】:

      【解决方案2】:

      默认情况下,进程之间不共享数据,但是使用进程间通信技术,如 Socket ,管道,RPC 等。您可以共享数据。

      【讨论】:

        【解决方案3】:

        在 UNIX 上,如果文件描述符未设置为在 exec 上关闭 (FD_CLOEXEC),则进程可以与其子进程共享文件描述符。同样,Windows 支持与子进程共享句柄,方法是在调用CreateFile() 时将lpSecurityAttributes->bInheritHandle 设置为TRUE,然后在调用CreateProcess 时将bInheritHandles 设置为TRUE。更不用说 Microsoft C 运行时 _open() 函数接受 _O_NOINHERIT 标志。

        在 Linux 上,clone() 系统调用让您可以对子进程与其父进程共享的内容进行大量控制:从地址空间 (CLONE_VM) 到文件描述符表 (CLONE_FILES) 到父进程的所有内容进程 ID (CLONE_PARENT) 可以共享也可以不共享。当然,添加此功能是为了支持内核线程。

        Thread-local storage (TLS) 对进程中的每个线程都有不同的索引,但实际内存在线程之间共享。

        【讨论】:

          【解决方案4】:

          这取决于上下文。在大多数情况下,完全独立的进程不会共享任何相同的内存,但在某些情况下,子进程将与父进程共享相同的内存空间,例如在 Unix 中使用 fork 时。在旧版本的 Windows (95,98,ME) 中,有一个共享内存区域在所有进程之间共享,但主要是系统 DLL 而非数据的空间。

          通常线程共享堆数据,但您需要小心地在一个线程中释放分配给另一个线程的内存,因为某些内存管理器依赖于堆栈。

          【讨论】:

            【解决方案5】:

            独立进程之间不共享任何数据。

            如果线程在同一个进程中运行,它们可以共享任何堆分配或静态数据。

            【讨论】:

            • 不准确。一个线程堆栈上的数据确实没有理由不能与另一个线程共享,只要带有数据的线程不从带有数据的堆栈帧返回。
            猜你喜欢
            • 2010-09-25
            • 2011-01-21
            • 1970-01-01
            • 1970-01-01
            • 2017-02-02
            • 1970-01-01
            • 2016-08-10
            相关资源
            最近更新 更多