【发布时间】:2010-09-15 16:29:13
【问题描述】:
Process 和 Thread 不会共享哪些数据?
提前感谢所有提供时间的人
【问题讨论】:
标签: c++ multithreading
Process 和 Thread 不会共享哪些数据?
提前感谢所有提供时间的人
【问题讨论】:
标签: c++ multithreading
在操作系统理论中(AFAIK 这适用于 Windows、Linux、*BSD 等操作系统)进程被定义为具有自己的页表的线程,即它的自己的虚拟内存空间。
其他任何东西都取决于操作系统(文件描述符、套接字等)。根据我的经验,此类线程属性通常使用复制进程的标准系统调用来复制。想想看,它更容易实现,也更有资源(少管闲事,保持非虚拟内存不碰它)。
【讨论】:
默认情况下,进程之间不共享数据,但是使用进程间通信技术,如 Socket ,管道,RPC 等。您可以共享数据。
【讨论】:
在 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) 对进程中的每个线程都有不同的索引,但实际内存在线程之间共享。
【讨论】:
这取决于上下文。在大多数情况下,完全独立的进程不会共享任何相同的内存,但在某些情况下,子进程将与父进程共享相同的内存空间,例如在 Unix 中使用 fork 时。在旧版本的 Windows (95,98,ME) 中,有一个共享内存区域在所有进程之间共享,但主要是系统 DLL 而非数据的空间。
通常线程共享堆数据,但您需要小心地在一个线程中释放分配给另一个线程的内存,因为某些内存管理器依赖于堆栈。
【讨论】:
独立进程之间不共享任何数据。
如果线程在同一个进程中运行,它们可以共享任何堆分配或静态数据。
【讨论】: