curl - 在同一应用程序上的许多动态加载的 DLL 之一中使用 CURL
问题描述
我在主机加载的插件(这是一个 dll)中使用 CURL,而主机又加载了一堆其他 dll。我无法控制或知道主机加载的任何其他组件是否使用 CURL,或者它们的加载/卸载顺序。据我所知,多次调用 curl_global_init() 是良性的。但是,由于以下问题,我不确定 curl_global_cleanup() :
- 从我的 dll 调用 curl_global_cleanup 可能会过早终止仍在使用它的其他组件的 CURL 会话。
- 其他调用 curl_global_cleanup 的 dll 可能会在我的 dll 仍在使用它时过早终止 CURL 会话。
文档说 curl_global_init 和 curl_global_cleanup 应该为使用相同内存空间的所有实体调用一次。编译 /MT 与 /MD 是否会影响这种情况?
解决方案
你需要做尽可能多cleanup
的 s 和你做init
s 的原因正是这样:如果程序的两个部分使用 CURL,那么你可能会得到两个init
s 和两个cleanup
s,只有最后一个cleanup
会是破坏性的。
但是,根据文档,这些调用不是线程安全的,您可能需要了解这一点,具体取决于其他库(以及您自己的库)的设计方式。
对此没有一般的答案,除了说,尽一切可能不交错这样的电话。如果这需要阅读其他库的源代码,那么这就是您必须要做的。希望您会发现它们都遵守以下规则(同样来自文档):
构建使用 libcurl 的程序的基本规则是:在程序启动后立即调用 curl_global_init,并使用CURL_GLOBAL_ALL参数,此时它仍然只有一个线程,并且在它使用 libcurl 之前。在程序退出之前立即调用 curl_global_cleanup,此时程序再次只有一个线程并且在最后一次使用 libcurl 之后。
您可以多次调用这两个,只要所有调用都满足这些要求并且每个调用的数量相同。
(接下来的段落比禁止交错更进一步,实际上建议从不调用init
或cleanup
在任何其他线程存在时,无论它是否使用 CURL。这是善意的并且在技术上是正确的,尽管根据您的观点可能有点过于激进观点。)
推荐阅读
- typescript - Typescript Infer 多个错误子类的返回值
- azure - 将 Azure 存储中的文件移动到共享网络目录
- postgresql - 如何在不停机的情况下更新 PostgreSQL 数据库?
- python - 如何在Django中从一个数字循环到一个数字?
- c - 在 C 程序中实现楼梯
- c++ - C++朋友关键字不访问非静态数据成员
- ubuntu - Docker-Compose 错误:执行 --version(当前版本 1.27.4)时出现“line 1: Not: command not found”
- css - 使用 Chrome 扩展更改网站的 CSS - 某些样式无法更改
- android - 从导航控制器导航更改工具栏标题不仅在下一个,而且在上一个片段中
- django - Django Admin format_html_join 不能与新行分隔