同步卷曲请求

时间:2015-04-30 11:12:36

标签: c++ multithreading curl libcurl

我试图向多个目标发出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);
}

我希望这可以提供帮助,谢谢!

2 个答案:

答案 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后,崩溃消失了。 :)