代码之家  ›  专栏  ›  技术社区  ›  Guillermo Prandi

C++/CLI托管线程清理

  •  0
  • Guillermo Prandi  · 技术社区  · 15 年前

    调试任何给定的VB.Net项目我至少可以看到7个线程;如果VB本身没有显式地创建工作线程(对此有任何确认吗?),我的库将只能看到一个线程。但是,如果需要,我需要库的客户机能够创建工作线程,因此我的库必须在某种程度上具有线程意识。

    我能想到的第一个选项是在类中公开一些“EnterThread()”和“LeaveThread()”方法,这样客户机代码将在开始时显式地调用它们,然后再退出它们的DoWork()方法。如果(1).Net没有“神奇地”创建用户不知道的线程,并且(2)用户非常小心地在某种try/finally结构中调用这些方法,那么这种方法应该是可行的。

    提前谢谢。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Will Robinson    15 年前

    根本的问题似乎是库包装器没有获得足够的线程信息可见性,而这些信息是与底层MySQL库正确通信所需的。在这种情况下,如果可能,我会尝试直接解决根本问题。

    在本例中,这意味着让包装器完全了解和控制哪些线程接触MySQL,这些线程何时启动,何时停止。

    例如,包装器库中的顶级对象可以在内部启动并拥有一个线程池,池中的每个线程在启动时调用mysql_thread_init(),在关闭时每个线程调用mysql_thread_end()。此线程池对VB.net版客户端代码,但在后台,对包装器库的每次调用都会传递给数据库通信的线程池线程之一,然后线程池线程将数据库响应返回给调用线程。

    当客户机销毁包装器对象时,包装器对象关闭并连接其内部线程池中的所有线程(每个线程在退出前调用mysql_thread_end())。然后一切都被解释清楚了。

    这可能是不可能的,这取决于您的具体情况(每次调用包装器都会产生上下文切换成本;小心!),但我觉得值得一提。

    如果这样的方法对您不起作用,那么您要么需要按照您提到的方式调用某种魔法系统voodoo(我不是CLI用户或Windows用户,因此我无法在这方面帮助您),要么您需要将责任传递给客户机。实现后者的一个简单方法就是说“包装器对象只能在创建它的线程中使用”。当然,当客户端不可避免地不遵守这个约束时,你仍然会面临一个新的可能出现的bug类。。。

    推荐文章