我试图向多个目标发出HTTP请求,我需要它们(几乎)在同一时刻运行。
我试图为每个请求创建一个帖子,但我不知道为什么Curl在执行时会崩溃。我每个线程使用一个简单的句柄,所以理论上一切都应该没问题......
有没有人有类似的问题?或者有谁知道多接口是否允许您选择何时执行所有请求?
非常感谢。
修改
以下是代码示例:
void Clazz::function(std::vector<std::string> urls, const std::string& data)
{
for (auto it : urls)
{
std::thread thread(&Clazz::DoRequest, this, it, data);
thread->detach();
}
}
int Clazz::DoRequest(const std::string& url, const std::string& data)
{
CURL* curl = curl_easy_init();
curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Expect:");
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 15);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt (curl, CURLOPT_FAILONERROR, 1L);
//curlMutex.lock();
curl_easy_perform(curl);
//curlMutex.unlock();
long responseCode = 404;
curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &responseCode);
curl_easy_cleanup(curl);
curl_slist_free_all(headers);
}
我希望这可以提供帮助,谢谢!
答案 0 :(得分:0)
你在任何地方打电话给curl_global_init
吗?也许早在你的main()方法中?
引自http://curl.haxx.se/libcurl/c/curl_global_init.html:
此函数不是线程安全的。当程序中的任何其他线程(即共享同一内存的线程)正在运行时,不得调用它。这并不仅仅意味着没有其他使用libcurl的线程。因为curl_global_init调用类似线程不安全的其他库的函数,所以它可能与使用这些其他库的任何其他线程冲突。
引自http://curl.haxx.se/libcurl/c/curl_easy_init.html:
如果您还没有调用curl_global_init,curl_easy_init会自动执行此操作。这在多线程情况下可能是致命的,因为curl_global_init不是线程安全的,并且可能导致资源问题,因为没有相应的清理。
听起来你没有打电话给curl_global_init
,让curl_easy_init
为你照顾它。既然你是在同时在两个线程上进行的,那么你就会遇到线程不安全的情况,并提到了致命的结果。
答案 1 :(得分:0)
能够在设备中正确调试后,y发现问题是curl的一个老问题。
http://curl.haxx.se/mail/lib-2010-11/0181.html
在每个curl句柄中使用CURLOPT_NOSIGNAL后,崩溃消失了。 :)