繁体   English   中英

Libcurl和curl_global_init在运行时加载的共享库中

[英]Libcurl and curl_global_init in shared library loaded at runtime

我正在开发一个照相亭应用程序,它使用3个模块来提供打印,捕获和触发功能。 我们的想法是人们可以为它开发扩展此功能的模块。 这些模块实现为共享库,在用户单击“开始”时在运行时加载。

我正在尝试实现一个“打印”到Facebook图库的打印机模块。 我想为此使用libcurl。 我的问题在于初始化函数: curl_global_init() libcurl API文档声明此函数绝对不是线程安全的。 来自文档

此功能不是线程安全的。 当程序中的任何其他线程(即共享相同内存的线程)正在运行时,您不能调用它。 这并不仅仅意味着没有其他使用libcurl的线程。 因为curl_global_init()调用类似线程不安全的其他库的函数,所以它可能与使用这些其他库的任何其他线程冲突。

在文档的其他地方 ,它说:

当您编写使用libcurl的代码不是主程序时,全局常量情况值得特别考虑,而是程序的模块化部分,例如另一个库。 作为一个模块,你的代码不知道程序的其他部分 - 它不知道它们是否使用libcurl。 它的代码不一定在整个程序的开始和结束时运行。

像这样的模块必须具有自己的全局常量函数,就像curl_global_init()和curl_global_cleanup()一样。 因此,模块在程序的开头和结尾具有控制权,并且可以调用libcurl函数。

......这似乎解决了这个问题。 但是,这似乎意味着我的模块的init()finalize()函数将在程序的开始和结束时调用。 由于模块设计为在运行时可以交换,因此我无法做到这一点。 即使我可以,我的应用程序使用GLib,根据他们的文档 ,假设没有运行的线程是绝对安全的:

...从版本2.32开始,GLib线程系统在程序开始时自动初始化,并且所有线程创建函数和同步原语都可以立即使用。

请注意,即使您没有自己调用g_thread_new(),也不能安全地假设您的程序没有线程。 GLib和GIO可以并且将为自己的目的创建线程......

我的问题是:有没有办法在我的应用程序中安全地调用curl_global_init() 我可以在我的模块的init()finalize()函数中调用curl_global_init()curl_global_cleanup()吗? 我需要找到另一个HTTP库吗?

首先,如果没有这些限制,您将找不到任何其他库,因为它们是由具有这些限制的第三方(主要是SSL)库中的libcurl继承的。 例如OpenSSL。

这就是说,global_init的线程安全情况非常不幸,而且我们(在curl项目中)非常不喜欢,但只要我们使用其他库,就无法做很多事情。 这也意味着您的确切情况取决于您的libcurl构建使用的确切依赖库。

在大多数情况下,您可以按照建议的方式从模块init()函数调用curl_global_init()。 我无法保证这是安全的,当然有100%的确定性,因为这里有一些我不能说的未知数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM