代码之家  ›  专栏  ›  技术社区  ›  Sarfaraz Nawaz

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

  •  5
  • Sarfaraz Nawaz  · 技术社区  · 14 年前

    几个月前,我遇到一个男人问我这个有趣的场景(关于奥克特)。虽然,我已经提出了一个“不可移植”的解决方案来解决这个问题(用小代码进行了测试),但我还是想知道你们有什么要说的和建议。

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

    不管怎样,以后的事情发生了变化,现在我希望使用相同的DLL 多线程应用程序 (不修改DLL);也就是说,多个线程从DLL访问函数和全局变量,并对它们进行修改。。等等。所有这些都可能导致全局变量保持不一致的值。

    所以问题是,

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

    2 回复  |  直到 11 年前
        1
  •  1
  •   BatchyX    14 年前

    我们可以在客户端代码中做些什么来防止对DLL的多次访问,同时确保每个线程在它自己的上下文中运行(也就是说,当它访问DLL时,DLL的全局值与以前一样)?

    这是最难的部分。我认为只有这样才能在现有的DLL周围创建一个包装器。调用时,它将还原当前线程的状态(全局变量),并在调用DLL返回时保存它们。您需要知道DLL中的所有状态变量,并能够读/写它们。

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

        2
  •  2
  •   Mephane    14 年前

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

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

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