![]() |
1
0
根本的问题似乎是库包装器没有获得足够的线程信息可见性,而这些信息是与底层MySQL库正确通信所需的。在这种情况下,如果可能,我会尝试直接解决根本问题。 在本例中,这意味着让包装器完全了解和控制哪些线程接触MySQL,这些线程何时启动,何时停止。 例如,包装器库中的顶级对象可以在内部启动并拥有一个线程池,池中的每个线程在启动时调用mysql_thread_init(),在关闭时每个线程调用mysql_thread_end()。此线程池对VB.net版客户端代码,但在后台,对包装器库的每次调用都会传递给数据库通信的线程池线程之一,然后线程池线程将数据库响应返回给调用线程。 当客户机销毁包装器对象时,包装器对象关闭并连接其内部线程池中的所有线程(每个线程在退出前调用mysql_thread_end())。然后一切都被解释清楚了。 这可能是不可能的,这取决于您的具体情况(每次调用包装器都会产生上下文切换成本;小心!),但我觉得值得一提。 如果这样的方法对您不起作用,那么您要么需要按照您提到的方式调用某种魔法系统voodoo(我不是CLI用户或Windows用户,因此我无法在这方面帮助您),要么您需要将责任传递给客户机。实现后者的一个简单方法就是说“包装器对象只能在创建它的线程中使用”。当然,当客户端不可避免地不遵守这个约束时,你仍然会面临一个新的可能出现的bug类。。。 |