首页 > 解决方案 > 在同一应用程序上的许多动态加载的 DLL 之一中使用 CURL

问题描述

我在主机加载的插件(这是一个 dll)中使用 CURL,而主机又加载了一堆其他 dll。我无法控制或知道主机加载的任何其他组件是否使用 CURL,或者它们的加载/卸载顺序。据我所知,多次调用 curl_global_init() 是良性的。但是,由于以下问题,我不确定 curl_global_cleanup() :

  1. 从我的 dll 调用 curl_global_cleanup 可能会过早终止仍在使用它的其他组件的 CURL 会话。
  2. 其他调用 curl_global_cleanup 的 dll 可能会在我的 dll 仍在使用它时过早终止 CURL 会话。

文档说 curl_global_init 和 curl_global_cleanup 应该为使用相同内存空间的所有实体调用一次。编译 /MT 与 /MD 是否会影响这种情况?

标签: curl

解决方案


你需要做尽可能多cleanup的 s 和你做inits 的原因正是这样:如果程序的两个部分使用 CURL,那么你可能会得到两个inits 和两个cleanups,只有最后一个cleanup会是破坏性的。

但是,根据文档,这些调用不是线程安全的,您可能需要了解这一点,具体取决于其他库(以及您自己的库)的设计方式。

对此没有一般的答案,除了说,尽一切可能不交错这样的电话。如果这需要阅读其他库的源代码,那么这就是您必须要做的。希望您会发现它们都遵守以下规则(同样来自文档):

构建使用 libcurl 的程序的基本规则是:在程序启动后立即调用 curl_global_init,并使用CURL_GLOBAL_ALL参数,此时它仍然只有一个线程,并且在它使用 libcurl 之前。在程序退出之前立即调用 curl_global_cleanup,此时程序再次只有一个线程并且在最后一次使用 libcurl 之后。

您可以多次调用这两个,只要所有调用都满足这些要求并且每个调用的数量相同。

(接下来的段落比禁止交错更进一步,实际上建议从不调用initcleanup任何其他线程存在时,无论它是否使用 CURL。这是善意的并且在技术上是正确的,尽管根据您的观点可能有点过于激进观点。)


推荐阅读