Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 进程和线程_C++_Multithreading - Fatal编程技术网

C++ 进程和线程

C++ 进程和线程,c++,multithreading,C++,Multithreading,进程和线程不共享的数据是什么 提前感谢提供时间的每个人单独的流程彼此之间不共享任何数据 如果线程在同一进程中运行,则可以共享任何堆分配或静态数据。这取决于上下文。在大多数情况下,完全独立的进程不会共享任何相同的内存,但在某些情况下,子进程将与父进程共享相同的内存空间,例如在Unix中使用fork时。在旧版本的Windows(95,98,ME)中,有一个共享内存区域,在所有进程之间共享,但主要是系统DLL空间,而不是数据空间 通常,线程共享堆数据,但您需要小心地在一个线程中释放分配给另一个线程的内

进程和线程不共享的数据是什么


提前感谢提供时间的每个人

单独的流程彼此之间不共享任何数据


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

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


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

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

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

在Linux上,系统调用为您提供了对子进程与其父进程共享内容的大量控制:从地址空间(
CLONE\u VM
)到文件描述符表(
CLONE\u FILES
)到父进程ID(
CLONE\u parent
)的所有内容都可以共享或不共享。当然,添加此功能是为了支持内核线程


进程中每个线程的索引不同,但实际内存在线程之间共享。

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


其他任何内容都取决于操作系统(文件描述符、套接字等)。根据我的经验,这样的线程属性通常是通过复制进程的标准系统调用来复制的。想想看,它更容易实现,而且资源也更丰富(更少的内务管理和不接触它而保留非虚拟内存)。

不准确。如果一个线程的堆栈上的数据不能与另一个线程共享,那么只要数据所在的线程没有从数据所在的堆栈帧返回,就没有理由不与另一个线程共享。