Libcurl - curl_multi_poll + curl_multi_add_handle - 在一个线程中 - 从不等待
Libcurl - curl_multi_poll + curl_multi_add_handle - in one thread - never waits
curl_multi_poll 函数结合 curl_multi_add_handle - 由于某种原因它从不等待事件并立即 returns:
简单示例:
#include <iostream>
#include <curl.h>
int main()
{
curl_global_init(CURL_GLOBAL_ALL);
CURLM* CURLM_ = curl_multi_init();
CURL* CURL_ = curl_easy_init();
curl_easy_setopt(CURL_, CURLOPT_URL, "https://whosebug.com");
int num_desc_events;
curl_multi_add_handle(CURLM_, CURL_); //If this line is deleted, then curl_multi_poll enters waits mode.
if (CURLMcode_ != CURLM_OK)
{
std::cout << "curl_multi_add_handle_status:" << CURLMcode_ << std::endl;
}
while (1)
{
std::cout << "curl_multi_poll_start" << std::endl;
curl_multi_poll(CURLM_, NULL, 0, 100000, &num_desc_events);
if (CURLMcode_ != CURLM_OK)
{
std::cout << "curl_multi_poll_status:" << CURLMcode_ << std::endl;
}
std::cout << "curl_multi_poll_awakened" << std::endl;
std::cout << "num_desc_events:" << num_desc_events << std::endl;
}
curl_multi_cleanup(CURLM_);
curl_global_cleanup();
}
如您所见,这是一个非常简单的代码,但它运行起来非常奇怪,甚至我会说它不起作用。
根据 curl_multi_poll 函数的描述,它会一直等待,直到在 mult 描述符上发生事件或设置超时。
即代码中有curl_multi_add_handle函数的一行时,curl_multi_poll函数不进入待机状态
并且如果删除带有 curl_multi_add_handle 函数的代码行,那么 curl_multi_poll 会正常工作并进入待机模式直到第一个事件,在这种情况下无限期或直到超时。
代码没有调用 curl_multi_perform() 所以它实际上什么也没做,无论 libcurl 想做什么,它仍然想做...
curl_multi_poll 函数结合 curl_multi_add_handle - 由于某种原因它从不等待事件并立即 returns:
简单示例:
#include <iostream>
#include <curl.h>
int main()
{
curl_global_init(CURL_GLOBAL_ALL);
CURLM* CURLM_ = curl_multi_init();
CURL* CURL_ = curl_easy_init();
curl_easy_setopt(CURL_, CURLOPT_URL, "https://whosebug.com");
int num_desc_events;
curl_multi_add_handle(CURLM_, CURL_); //If this line is deleted, then curl_multi_poll enters waits mode.
if (CURLMcode_ != CURLM_OK)
{
std::cout << "curl_multi_add_handle_status:" << CURLMcode_ << std::endl;
}
while (1)
{
std::cout << "curl_multi_poll_start" << std::endl;
curl_multi_poll(CURLM_, NULL, 0, 100000, &num_desc_events);
if (CURLMcode_ != CURLM_OK)
{
std::cout << "curl_multi_poll_status:" << CURLMcode_ << std::endl;
}
std::cout << "curl_multi_poll_awakened" << std::endl;
std::cout << "num_desc_events:" << num_desc_events << std::endl;
}
curl_multi_cleanup(CURLM_);
curl_global_cleanup();
}
如您所见,这是一个非常简单的代码,但它运行起来非常奇怪,甚至我会说它不起作用。
根据 curl_multi_poll 函数的描述,它会一直等待,直到在 mult 描述符上发生事件或设置超时。
即代码中有curl_multi_add_handle函数的一行时,curl_multi_poll函数不进入待机状态
并且如果删除带有 curl_multi_add_handle 函数的代码行,那么 curl_multi_poll 会正常工作并进入待机模式直到第一个事件,在这种情况下无限期或直到超时。
代码没有调用 curl_multi_perform() 所以它实际上什么也没做,无论 libcurl 想做什么,它仍然想做...