在同一应用程序上的多个动态加载DLL之一中使用CURL

在同一应用程序上的多个动态加载DLL之一中使用CURL,curl,Curl,我在一个由主机加载的插件(这是一个dll)中使用了CURL,而主机又加载了一堆其他dll。我不知道主机加载的任何其他组件是否使用CURL,也不知道它们的加载/卸载顺序。 据我所知,多次调用curl\u global\u init()是有益的。但是,我不确定curl_global_cleanup()是否正确,因为存在以下问题: 从我的dll调用curl_global_cleanup可能会提前终止仍在使用它的其他组件的curl会话 其他调用curl\u global\u cleanup的dll可能会

我在一个由主机加载的插件(这是一个dll)中使用了CURL,而主机又加载了一堆其他dll。我不知道主机加载的任何其他组件是否使用CURL,也不知道它们的加载/卸载顺序。 据我所知,多次调用curl\u global\u init()是有益的。但是,我不确定curl_global_cleanup()是否正确,因为存在以下问题:

  • 从我的dll调用curl_global_cleanup可能会提前终止仍在使用它的其他组件的curl会话
  • 其他调用curl\u global\u cleanup的dll可能会在我的dll仍在使用时过早终止curl会话

  • 文档说,对于使用相同内存空间的所有实体,应该调用curl\u global\u init和curl\u global\u cleanup一次。编译/MT vs/MD是否会影响这种情况?

    您需要像执行
    init
    s一样执行大量
    cleanup
    s的原因正是:如果程序的两个部分使用CURL,那么您可能会得到两个
    init
    s和两个
    cleanup
    s,并且只有最后一个
    cleanup
    将是破坏性的

    但是,根据文档,这些调用不是线程安全的,根据其他库(以及您自己的库)的设计方式,您可能需要注意这一点

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

    构造使用libcurl的程序的基本规则是:在程序启动后立即调用curl\u global\u init,使用curl\u global\u ALL参数,而它仍然只有一个线程,在使用libcurl之前。在程序退出之前调用curl_global_cleanup,此时程序仍然只有一个线程,并且在最后一次使用libcurl之后

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


    (后面的段落不仅仅是禁止交错,实际上建议在存在任何其他线程时,无论是否使用CURL,都不要调用
    init
    cleanup
    。这是出于善意的,在技术上是正确的,尽管根据您的观点可能有点过于激进。)

    谢谢!我想我所能做的就是坚持最佳实践,祈祷主机插件的其他开发人员也这么做。哦,在这种情况下,用一些try/catch来包装curl\u global\u cleanup调用不会有什么坏处…@sunch这是一个C API,所以不会出现任何异常。