Synchronized curl requests

柔情痞子 提交于 2019-12-08 09:29:22

问题


I'm trying to do HTTP requests to multiple targets, and I need to them to run (almost) exactly at the same moment.

I'm trying to create a thread for each request, but I don't know why Curl is crashing when doing the perform. I'm using an easy-handle per thread so in theory everything should be ok...

Has anybody had a similar problem? or Does anyone know if the multi interface allows you to choose when to perform all the requests?

Thanks a lot.

EDIT:

Here is an example of the code:

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);
}

I hope this can help, thanks!


回答1:


Are you calling curl_global_init anywhere? Perhaps rather early in your main() method?

Quoting from http://curl.haxx.se/libcurl/c/curl_global_init.html:

This function is not thread safe. You must not call it when any other thread in the program (i.e. a thread sharing the same memory) is running. This doesn't just mean no other thread that is using libcurl. Because curl_global_init calls functions of other libraries that are similarly thread unsafe, it could conflict with any other thread that uses these other libraries.

Quoting from http://curl.haxx.se/libcurl/c/curl_easy_init.html:

If you did not already call curl_global_init, curl_easy_init does it automatically. This may be lethal in multi-threaded cases, since curl_global_init is not thread-safe, and it may result in resource problems because there is no corresponding cleanup.

It sounds like you're not calling curl_global_init, and letting curl_easy_init take care of it for you. Since you're doing it on two threads simultaneously, you're hitting the thread unsafe scenario, with the lethal result that was mentioned.




回答2:


After being able to debug properly in the device y have found that the problem is an old know issue with curl.

http://curl.haxx.se/mail/lib-2010-11/0181.html

after using CURLOPT_NOSIGNAL in every curl handle the crash has disappeared. :)



来源:https://stackoverflow.com/questions/29966220/synchronized-curl-requests

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!