从多个线程使用时,Libcurl返回超时错误,但不是来自单个线程

时间:2011-12-13 08:09:00

标签: c++ multithreading libcurl

我正在使用libcurl和C ++。我已经为下载网页制作了一个线程安全的类。每次调用静态download方法都会创建“简单”句柄,执行作业并释放句柄。当我从单线程中使用它时 - 一切都很好。但是,当我产生多个线程并行下载多个页面时,我有时(不是每次下载,而是经常)得到错误说“超时”。我配置了相当高的超时(5秒连接超时和25秒全局超时)。

关于可能是什么原因以及如何解决它的任何想法?

P上。 S.它发生在Windows和Linux上。

以下是相关方法的代码:

void CHttpDownloaderLibcurl::downloaderThread( const CUrl& url, CThreadSafeQueue<CHtmlPage>& q)
{
    CHtmlPage page (url);

    CURL* handle = curl_easy_init();

    if (!handle)
    {
        assert(handle);
        return;
    }

    int curlErr = setCurlOptions(handle, url, (void*)onCurlDownloadCallback, (void*)&page.byteArray());
    if (CURLE_OK != curlErr)
    {
        assert("Error setting options" == (char*)curlErr);
        return;
    }

    curlErr = curl_easy_perform(handle);

    page._info = getInfo(handle);

    curl_easy_cleanup(handle);
    if (CURLE_OK != curlErr)
    {
        if (curlErr == CURLE_OPERATION_TIMEDOUT)
        {
            CLogger() << "Curl timeout!";
        }
        else
            CLogger() << url.urlString() << ": Error performing download = " << curlErr;
        return;
    }

    q.push(page);
}

0 个答案:

没有答案