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 想做什么,它仍然想做...