在多线程应用程序中安全地卸载DLL /共享对象

时间:2016-03-07 10:26:45

标签: c++ multithreading dll

所以我有一个用C ++编写的多线程应用程序,整个应用程序是使用异步事件处理模型实现的。线程调用的函数基于一个id(数组索引),其函数指针存储在索引的数组中(具有id的值),即,如果我将一个id为45的事件插入到事件队列中,其中一个线程选择事件并调用其指针存储在索引45的函数。 现在,其中一些函数位于dll / shared对象中,可以通过来自不同id的事件随时卸载。发生这种情况时,会调用FreeLibrary(或等效文件)。这会导致应用程序崩溃,我认为这是因为有些线程仍然在dll中执行函数。所以我的问题是,有没有办法安全地卸载DLL而不必担心线程仍在执行dll中的代码,或者有一种方法可以检查有多少线程仍然在dll中执行代码?

1 个答案:

答案 0 :(得分:1)

您可能有一个对象在其构造函数中加载库,在析构函数中卸载它,并且为库中的每个符号都有一个非静态成员函数包装器。那么该对象的生命周期将是库的生命周期。

现在,您的问题已减少为管理多线程程序中的对象。可能shared_ptr符合您的需求。也许你已经有了另一个共享对象,所以你可以简单地将库包装器作为数据成员放在该对象中。