我从Eric Lippert's answer了解到“两个进程可以共享非私有内存页面,如果有二十个进程全部加载同一个DLL,那么进程全部共享该代码的内存页面,它们不共享虚拟内存地址空间,它们共享记忆。”DLL如何处理来自多个进程的并发?
现在,如果硬盘上的相同DLL文件在加载到应用程序后将共享相同的物理内存(不管是RAM还是页面文件),而是映射到不同的虚拟内存地址空间,处理并发性相当困难?
据我所知,C++中的并发概念更多的是关于处理线程 - 一个进程可以启动多个线程,每个线程可以运行在一个单独的核心上,所以当不同的线程同时调用DLL时,可能会有数据竞速,我们需要互斥,锁定,信号,条件变量等等。
但是,DLL如何处理多进程?数据赛车的相同概念将会发生,不是吗?有什么工具可以处理?仍然是相同的工具集?
并发只有当你共享可写数据的问题。这不是在这里发生的。 –
我相信这些页面是在写入时共享的。因此,如果在DLL内部存在可变状态(而不仅仅是代码),每个进程都将获得它自己的页面版本。 (对于Windows来说,如果知道这是否可行,或者DLL内存是只读的,那么这种方法不够完善)。 – Thilo
@KerrekSB所以一个DLL不能拥有自己的可写内存?一个DLL正在处理的所有内存是否由进程拥有? – athos