如果一个应用程序中的多个线程调用单个DLL会发生什么?

What happens if Multiple threads in one application call a single DLL

本文关键字:DLL 单个 调用 什么 线程 一个 应用程序 如果      更新时间:2023-10-16

我想知道当一个应用程序中的三个线程(几乎)同时从DLL调用静态方法时会发生什么。是否有3个实例的DLL加载为每个线程或其他线程只获得访问DLL一旦第一个线程完成与DLL静态方法(即)每个线程获得访问DLL一旦轮到它?

是否加载了3个DLL实例,每个线程一个?

。dll 通常每个进程加载一次。(这里有一些微妙的问题;如果使用LoadLoadFrom,同一个程序集可能被加载两次。但这是一种罕见的情况,与线程无关。)

是否第二个和第三个线程只有在第一个线程使用DLL静态方法完成后才能访问DLL ?

没有;静态方法是而不是自动序列化的。如果你需要这个方法来确保一次只有一个线程访问它,那么你将不得不自己编写代码来完成。

静态构造函数的行为有点像那样。运行时将确保"赢得比赛"的线程将运行静态构造函数。其他线程将等待第一个线程完成该动作。请阅读我最近关于这方面的一系列文章了解详情。 http://ericlippert.com/tag/static-constructors/

一般情况下,代码只加载一次,即使是非静态对象。

您需要担心的是声明变量(统称为状态)中包含的信息,而不是代码。

DLL只加载一次。

如果在同一个进程中有多个线程调用或访问DLL中的全局变量,DLL必须通过使用临界区保护对全局/共享数据的访问来保证线程安全。

如果有来自多个进程的多个线程访问同一个DLL,只要不超过一个进程的线程访问同一个DLL,线程安全就不是问题。

操作系统巧妙地管理内存,使其开始时只有一个代码和数据部分的副本。数据段页被映射为只读。当需要在其中一个进程中修改任何全局数据时,操作系统将获得分段错误,并创建该页的副本,并将其映射为进程内存空间中的可写。这种方法被称为写时复制。