Yon*_*han 3 c++ memory dll memory-management
我有一些关于DLL的设计问题,我现在正在调用它,因为维基百科指的是DLL Hell问题如下:
我创建了一个系统,它有多个模块实现为DLL.这些在应用程序中使用,并且可以加载DLL,但并非所有这些都是必需的.如果只做数学之类的东西,它可以链接到'Utilities.dll'并使用它.问题是,我有一个记录器/跟踪器.这会将所有内容记录到文件和调试控制台,调试控制台只是一个流输出.问题是如何处理多个DLL尝试使用相同的日志类.看到日志类在这个'Utilities.dll'中,像'DataManagers.dll'和其他dll这样的东西也想要使用日志类功能.这包括登录到文件.我目前正在使用关键部分来确保没有发生写入冲突,但是看到关键部分是在usermode中实现的,我必须切换到互斥锁,或者在某些时候类似于拥有内核模式对象.但是,如果我只使用一个关键部分,那么在DLL内存中有多个日志类实例就意味着我会遇到一些严重的问题.
我似乎无法拼凑的是一种方法,所有DLL都能够使用相同的日志类实例,而无需逐个链接到Utilities.dll.我不想将8个dll加载到我的演示项目中,并且让所有8个dll引用带有日志类的那个dll,如果我需要更多的东西,比如日志类,这将是一个连锁反应.有没有办法正确地做到这一点?使用类的功能,在其他DLL和.exe窗口二进制文件中的DLL内使用静态函数,使用相同的"静态"函数,从而在写入日志文件甚至调试控制台的输出流时不会发生冲突.
如果我完全错了并且尝试做不可能的事情,请告诉我并帮助实现尽可能接近的事情.我知道在DLL中使用Singleton模式时会出现类似问题,但这可以解决
到目前为止我尝试过的:
我也发现这个问题是similair(即使是我的全球工具库的名称也是如此...)但是它没有回答我的问题并且有一些不同的方法以及来自'09 .如何模仿静态库但使用DLL的"应用程序中的全局变量的多个实例"行为?
你的问题根本不是"DLL Hell".
这是基本了解DLL如何工作的问题.每个进程最多加载一次DLL.因此,如果您的DLL被多个其他DLL使用,则每个进程仍然会存在一次.如果您的日志类对象在DLL中实现为单例(例如全局对象),则每个进程都有一个对象.
然后应保护该对象不受进程内的并发使用的影响.关键部分是流程本地的,与之完美匹配.您不需要互斥锁,因为两个进程都有自己的Utilities.DLL副本及其对象.
您可能,如果你的记录器记录到一个固定的文件有问题.在这种情况下,两个进程将尝试登录到同一文件.这是一个你不想破解的设计问题.保持日志输出分开,因此请确保每个记录器都写入唯一的日志文件.
归档时间: |
|
查看次数: |
2632 次 |
最近记录: |