http://hi.baidu.com/jjxiaoyan/item/e17b9ec3e31b93d4964452d8

 

libcurl是一个不错的socket库,而且又是开源的。如果仅仅是简单的HTTP请求,那么只需要几行代码就能轻松实现。不过要用libcurl实现高效、高频率的HTTP请求就需要对libcurl有深入的了解才行。如果阅读英文无障碍的话,那么libcurl自带的示例程序和帮助文档就是最好的老师。

一、多线程HTTP请求

libcurl提供多线程和异步请求来实现大批量HTTP请求,可参见multithread.c和multi-app.c两个示例程序。这两种批量HTTP请求的方式在测试环境下都能正常运行,但使用异步请求总是会出现问题,于是将目标转向多线程请求。

多线程HTTP请求要注意的几个问题:

1. 千万不要在多线程之间共享同一个CURL对象

在libcurl中,第一步要做的就是使用curl_easy_int函数来初始化一个CURL对象,每个CURL对应一个HTTP连接。于是,在批量请求时为了省去每次进行HTTP连接的时间,会对多个HTTP请求使用同一个CURL对象。这在非多线程状态下是不会出问题的,但在多线程下则会出问题。具体原因未知,网上查找到的资料对此解释不太详细。

所以我们需要为每一个线程建立一个CURL对象:

void threadfunc( void *p )
{
    CURL *curl;
    
    curl = curl_easy_init();
    ...
    ...
    ...
    curl_easy_cleanup( curl );
}

 



2. 避免多个线程中同时调用curl_global_init函数

在多线程环境下,应在主线程中使用curl_global_init和curl_global_cleanup函数。

第一次调用 curl_easy_init()时,curl_easy_init 会调用 curl_global_init,在单线程环境下,这不是问题。但是多线程下就不行了,因为curl_global_init不是线程安全的。在多个线程中调用curl_easy_int,然后如果两个线程同时发现curl_global_init还没有被调用,同时调用 curl_global_init,悲剧就发生了。这种情况发生的概率很小,但可能性是存在的。

int main()
{
    curl_global_init( CURL_GLOBAL_ALL );

    /* 创建多线程代码 */
    ...
    ...

    curl_global_cleanup();
    return 0;
}
View Code

相关文章:

  • 2021-12-23
  • 2021-06-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-01
猜你喜欢
  • 2022-02-12
  • 2021-07-11
  • 2022-02-07
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-01
相关资源
相似解决方案