Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 同步的curl请求_C++_Multithreading_Curl_Libcurl - Fatal编程技术网

C++ 同步的curl请求

C++ 同步的curl请求,c++,multithreading,curl,libcurl,C++,Multithreading,Curl,Libcurl,我正在尝试对多个目标执行HTTP请求,我需要让它们(几乎)同时运行 我试图为每个请求创建一个线程,但我不知道为什么在执行时Curl会崩溃。我使用一个简单的处理每个线程,所以在理论上一切都应该是好的 有人有过类似的问题吗?或者有人知道多接口是否允许您选择何时执行所有请求吗 非常感谢 编辑: 下面是一个代码示例: void Clazz::function(std::vector<std::string> urls, const std::string& data) { f

我正在尝试对多个目标执行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);
}
void Clazz::function(std::vector url、const std::string和data)
{
用于(自动it:URL)
{
std::thread thread(&Clazz::DoRequest、this、it、data);
线程->分离();
}
}
int Clazz::DoRequest(常量std::string和url,常量std::string和数据)
{
CURL*CURL=CURL_easy_init();
curl_slist*headers=NULL;
headers=curl\u slist\u append(headers,“Expect:”);
headers=curl\u slist\u append(headers,“内容类型: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());
卷曲度(卷曲度,卷曲度)设置错误,1L;
//curlMutex.lock();
旋度,易于执行(旋度);
//curlMutex.unlock();
长响应代码=404;
curl\u easy\u getinfo(curl、CURLINFO\u RESPONSE\u CODE和responseCode);
旋度\轻松\清洁(旋度);
卷曲/滑动/自由/全部(标题);
}

我希望这能有所帮助,谢谢

您在任何地方调用
curl\u global\u init
?也许是在main()方法的早期

引述自:

此函数不是线程安全的。当程序中的任何其他线程(即共享相同内存的线程)正在运行时,不得调用此函数。这不仅仅意味着没有其他线程使用libcurl。因为curl_global_init调用其他类似线程不安全的库的函数,所以它可能与使用这些库的任何其他线程冲突

引述自:

如果您还没有调用curl\u global\u init,curl\u easy\u init会自动执行。这在多线程情况下可能是致命的,因为curl_global_init不是线程安全的,并且由于没有相应的清理,可能会导致资源问题


听起来你不是在调用
curl\u global\u init
,而是让
curl\u easy\u init
为你处理它。由于您同时在两个线程上执行此操作,因此您遇到了线程不安全的情况,导致了前面提到的致命后果。

在能够在设备中正确调试后,y发现此问题是curl的一个已知问题


在每个curl句柄中使用CURLOPT_NOSIGNAL后,崩溃消失了。:)

发布一个代码示例,以便我们更好地理解。据我所知,cUrl支持多线程(OS?编译器?),有两种方法可以实现这一点,而且两种方法都可以很好地工作。使用多接口并在同一线程中发送两个请求。或者创建两个线程并使用easy接口。在调用cUrl时尝试使用互斥,这样可以将可能性范围缩小到cUrl中的竞争条件(不吉利)或如何使用它(更不吉利;))从两个不同的线程调用curl\u easy\u perform时不需要互斥。我刚刚编辑了这个问题以添加代码片段。我希望这能有所帮助。如果我取消对锁的注释,它可以正常工作,但会被序列化。我试图复制这两个参数,以避免在线程使用它之前破坏刺的机会。。。。但什么都不管用,我想不是这样的。我在主函数的第一行调用curl\u global\u init。。。