场景:DLL中的全局变量,由多线程应用程序使用

Naw*_*waz 5 c++ multithreading mutex global-variables critical-section

几个月前,我遇到了一个人(在orkut上)提出的有趣场景.虽然,我已经想出了一个解决这个问题的"非便携式"解决方案(用小代码测试过),但仍然想知道你们要说些什么并提出建议.

假设,我创建了一个DLL,导出一些用C++编写的功能,用于单线程客户端.这个DLL声明了很多全局变量,有些可能是const变量(只读)而其他变量是可修改的.

无论如何,后来的事情发生了变化,现在我想让同一个DLL与多线程应用程序一起工作(不修改DLL); 这意味着,几个线程从DLL访问函数和全局变量,并修改它们等等.所有这些都可能导致全局变量保持不一致的值.

所以问题是,

我们可以在客户端代码中做些什么来阻止DLL的多次访问,同时确保每个线程在它自己的上下文中运行(意味着,当它访问DLL时,DLL的全局值与它之前)?

Kei*_*thB 1

我们能否在客户端代码中做一些事情来防止 DLL 的多重访问,同时确保每个线程在它自己的上下文中运行(这意味着,当它访问 DLL 时,DLL 的全局值与这是之前)?

这是最难的部分。我认为做到这一点的唯一方法是围绕现有的 DLL 创建一个包装器。当它被调用时,它将恢复当前线程的状态(全局变量),并在对 DLL 的调用返回时保存它们。您需要了解 DLL 中的所有状态变量,并能够读/写它们。

如果性能不是问题,整个 DLL 的单个锁就足够了,并且是最容易正确实现的。这将确保一次只有一个线程访问(读取或写入)DLL。