流程和线程

时间:2008-10-07 04:03:17

标签: c++ multithreading

Process和Thread不会共享的数据是什么?

感谢所有提供时间的人

5 个答案:

答案 0 :(得分:3)

单独的进程不会彼此共享任何数据。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

其他任何操作依赖于操作系统(文件描述符,套接字等)。根据我的经验,这些线程属性通常通过复制进程的标准系统调用进行复制。考虑一下,它更容易实现,也更有资源(更少的管家和保持非虚拟内存而不触及它)。

答案 4 :(得分:0)

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

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

对于进程中的每个线程,

Thread-local storage (TLS)的索引方式不同,但实际内存在线程之间共享。