5

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

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

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

所以问题是,

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

4

2 回答 2

2

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

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

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

于 2010-11-30T12:06:37.033 回答
1

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

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

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

于 2010-11-30T15:29:37.717 回答