如果一个应用程序中的多个线程调用单个DLL会发生什么?
What happens if Multiple threads in one application call a single DLL
我想知道当一个应用程序中的三个线程(几乎)同时从DLL调用静态方法时会发生什么。是否有3个实例的DLL加载为每个线程或其他线程只获得访问DLL一旦第一个线程完成与DLL静态方法(即)每个线程获得访问DLL一旦轮到它?
是否加载了3个DLL实例,每个线程一个?
。dll 通常每个进程加载一次。(这里有一些微妙的问题;如果使用Load
和LoadFrom
,同一个程序集可能被加载两次。但这是一种罕见的情况,与线程无关。)
是否第二个和第三个线程只有在第一个线程使用DLL静态方法完成后才能访问DLL ?
没有;静态方法是而不是自动序列化的。如果你需要这个方法来确保一次只有一个线程访问它,那么你将不得不自己编写代码来完成。
静态构造函数的行为有点像那样。运行时将确保"赢得比赛"的线程将运行静态构造函数。其他线程将等待第一个线程完成该动作。请阅读我最近关于这方面的一系列文章了解详情。 http://ericlippert.com/tag/static-constructors/一般情况下,代码只加载一次,即使是非静态对象。
您需要担心的是声明变量(统称为状态)中包含的信息,而不是代码。
DLL只加载一次。
如果在同一个进程中有多个线程调用或访问DLL中的全局变量,DLL必须通过使用临界区保护对全局/共享数据的访问来保证线程安全。
如果有来自多个进程的多个线程访问同一个DLL,只要不超过一个进程的线程访问同一个DLL,线程安全就不是问题。
操作系统巧妙地管理内存,使其开始时只有一个代码和数据部分的副本。数据段页被映射为只读。当需要在其中一个进程中修改任何全局数据时,操作系统将获得分段错误,并创建该页的副本,并将其映射为进程内存空间中的可写。这种方法被称为写时复制。
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- vs 2015 C 重新分布可在单个DLL中
- 将非托管和托管dll合并到DotNet中的单个dll中
- 许多函数的单个DLL入口点
- 2个项目可以在MS VS 2008中创建单个DLL
- 无法在跨多个 DLL 的标头中定义单个对象
- 单个类实例在GUI exe和dll中是不同的
- 如何在vc++中在多个进程中加载单个DLL
- 如何在单个Windows环境中准备生成.dll和unix .so的构建作业
- Qt构建到一个没有dll的单个exe文件
- 如果一个应用程序中的多个线程调用单个DLL会发生什么?
- c++:如何在没有mingwm10.dll的情况下发布单个可执行文件