进程和线程
Process and Thread
Process和Thread不会共享哪些数据?
提前感谢所有提供时间
单独的进程之间不共享任何数据。
如果线程在同一进程中运行,那么它们可以共享任何堆分配的或静态的数据。
这取决于上下文。在大多数情况下,完全独立的进程不共享任何相同的内存,但在某些情况下,子进程将与父进程共享相同的内存空间,例如在Unix中使用fork时。在旧版本的Windows(95,98,ME)中,有一个在所有进程之间共享的共享内存区域,但主要是用于系统DLL而非数据的空间。
通常线程共享堆数据,但您需要小心地释放一个线程中分配给另一个线程的内存,因为一些内存管理器依赖于堆栈。
BY默认进程之间不共享数据,但使用进程间通信技术,如Socket、Pipes、RPC等。您可以共享数据。
在操作系统理论中(AFAIK这适用于Windows、Linux、*BSD等操作系统),进程被定义为具有自己的页表的线程,即其自己的虚拟内存空间。
其他任何东西都依赖于操作系统(文件描述符、套接字等)。根据我的经验,这样的线程属性通常是用复制进程的标准系统调用复制的。想想看,它更容易实现,也更足智多谋(更少的家务劳动,保留非虚拟内存而不接触它)。
在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
),所有内容都可以共享或不共享。当然,添加此功能是为了支持内核线程。
进程中每个线程的线程本地存储(TLS)索引不同,但实际内存在线程之间共享。
- 异常属于C++中的线程还是进程
- 将更高的优先级设置为 boost::asio 线程处理进程
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 多线程:线程或进程.h - C++
- BOOST线程:线程还是进程
- 将进程的执行从线程1转移到线程2
- std::async 如果线程是从 DLL 创建的,则会阻止进程退出?
- 优化吞吐量:多线程与多进程
- 多个线程/进程是否可以在不同步的情况下同时从/写入文件的非重叠区域?
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- 为不受支持的平台调整Boost线程/进程
- gdb是如何连接到多线程进程的
- 提振.Asio复合操作在单线程和多线程进程
- gdb如何连接到多线程进程
- 独立的多线程进程同时阻塞
- 在多线程进程中处理信号的示例
- 多线程进程中的信号处理
- 在Linux/ c++中,发送给线程/进程的信号是否使其变为活动状态?
- 如果一个且只有一个线程被停止,可以从多线程进程中跟踪读/写数据
- C++线程/进程标识符