c++ - 场景 : Global variables in DLL which is used by Multi-threaded Application

标签 c++ multithreading global-variables mutex critical-section

几个月前,我遇到了一个人(在 orkut 上)问的这个有趣的场景。虽然,我已经针对这个问题提出了一个“不可移植”的解决方案(已经用小代码对其进行了测试),但仍然想知道你们有什么要说的和建议的。

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

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

所以问题是,

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

最佳答案

当然,您始终可以创建一个包装层来处理多线程特定任务,例如锁定。您甚至可以在与原始 DLL 链接的第二个 DLL 中执行此操作,然后将最终项目链接到该新 DLL。

请注意,无论您如何实现,这都不是一件容易的事。您必须确切地知道哪个线程能够在什么时候修改哪个值,谁能够读取什么以及什么时候等等。除非您想遇到死锁或竞争条件等问题。

如果您的解决方案允许,通常最好分配一个线程来修改任何数据,并让所有其他线程只读不写,因为并发读取访问总是比并发写入访问更容易实现(Boost 提供这样做的所有基本功能,例如 shared_mutex )。

关于c++ - 场景 : Global variables in DLL which is used by Multi-threaded Application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4313392/

相关文章:

c - 声明全局结构会导致段错误,但局部化时就可以了?

python - 我可以防止修改 Python 中的对象吗?

c++ - 带有 WIN32 API 的全局热键?

C++如何在十进制系统中添加两个数字?

java - java中根据条件动态添加执行器

java - Java类是由第一次使用它的线程初始化的吗?

python - 异步交互式 Python 脚本

c++ - 此功能中的某些内容导致我的程序崩溃!

C++ Box2D,用 Kinematic Body 模拟 Dynamic Body 行为

android - Broadcastreceiver 中 Applicationcontext 的不同实例