转载
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不是线