jen*_*nsa 1 c++ multithreading libcurl http-request
我有一个关于使用libcurl(C++)执行并行HTTP请求的安全性的问题.在阅读这个问题时,请记住我对HTTP请求的了解有限.
基本上,假设我有两个(或更多)线程,每个线程每秒发出一次HTTP请求.(所有请求都是在同一台服务器上).我的程序(或其他什么?)如何跟踪HTTP响应属于哪个步骤?我的意思是,我可以确定如果请求A是从线程1发送的,并且同时从线程2请求B,并且同时恢复响应,则正确的响应(响应A)将转到线程1并且响应B到线程2?
请原谅我对这件事的无知.
谢谢.
首先libcurl是线程安全的:
libcurl的设计和实现完全是线程安全的
正如本官方文档所指出的,您需要做的就是:
永远不要在多个线程之间共享libcurl句柄.在任何给定时间,您应该只在一个线程中使用一个句柄.
此外,还有这个官方的FAQ条目,提供了一些更精确的,例如,如果您打算使用SSL:
如果在多线程环境中使用OpenSSL驱动的libcurl,则需要提供一个或两个锁定功能
正如您所看到的,有一个官方示例说明了easy句柄的多线程使用:请参阅multithread.c:
/* This is the callback executed when a new threads starts */
static void *pull_one_url(void *url)
{
CURL *curl;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_perform(curl); /* ignores error */
curl_easy_cleanup(curl);
return NULL;
}
/* ... */
/* This is the main loop that creates `NUMT` threads for parallel fetching */
for(i=0; i< NUMT; i++) {
error = pthread_create(&tid[i],
NULL, /* default attributes please */
pull_one_url,
(void *)urls[i]);
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
所以请随意尝试这个例子.
最后请记住,libcurl还提供了一个所谓的多接口,它使用单个线程提供多个传输.根据您的使用情况,您可能会发现它很方便.
编辑
关于OpenSSL +多线程,有一些特定的官方示例可能会有所帮助: