Libcurl -curl_multi_poll +curl_multi_add_handle -从不等待

问题描述 投票:0回答:1

curl_multi_poll 函数与curl_multi_add_handle 结合使用 - 由于某种原因,它从不等待事件并立即返回:

#include <iostream>
#include <thread>
#include <chrono>
#include <curl.h>   





void my_Infinity_loop(CURLM* CURLM_)
{

    int num_desc_events;
    CURL* CURL_ = curl_easy_init();


    while (1)
    {
       std::cout << "curl_multi_poll_start" << std::endl;

       curl_multi_poll(CURLM_, NULL, 0, 1000000, &num_desc_events); 

       std::cout << "curl_multi_poll_awakened" << std::endl;
       std::cout << "num_desc_events:" << num_desc_events << std::endl; //always - 0.

       curl_multi_add_handle(CURLM_, CURL_);    //If this line is deleted, then curl_multi_poll will wait again

    }

}



void my_wakeup_func(CURLM* CURLM_)
{
    std::this_thread::sleep_for(std::chrono::seconds(5));           

    curl_multi_wakeup(CURLM_);

    std::cout << "curl_multi_wakeup_START" << std::endl;
}






int main()
{
    

    curl_global_init(CURL_GLOBAL_ALL); 

    CURLM* CURLM_ = curl_multi_init();


    std::thread thread_1 (my_Infinity_loop, CURLM_);

    std::thread thread_2(my_wakeup_func, CURLM_);





    thread_1.join();
    thread_2.join();

    curl_multi_cleanup(CURLM_);
    curl_global_cleanup();
}

- 也就是说,我创建一个线程,在其中运行无限循环 - 使用curl_multi_poll 等待多描述符上的事件。

-在第二个线程中,我运行该函数 - 等待 5 秒,之后 - 该函数通过curl_multi_wakeup 函数唤醒curl_multi_poll。

-curl_multi_poll 唤醒,循环调用curl_multi_add_handle 函数。之后,循环返回到curl_multi_poll函数,但是curl_multi_poll - 立即结束,它不等待事件。我不明白为什么。

-但是,如果您从循环中删除curl_multi_add_handle函数,那么一切都很好,curl_multi_poll函数将再次进入待机模式。

我错过了什么?

c++ c libcurl
1个回答
0
投票

这可能有点晚了(2年零3个月),但为了帮助任何有类似问题的人,我决定回答这个问题。

问题似乎直接来自 curl_multi_wakeup 函数的

文档

如果在没有curl_multi_poll调用时调用该函数,则会导致下一次调用立即返回。

可能,这意味着您的

curl_multi_wakeup
调用已完成,而
curl_multi_poll
调用未运行,导致其下一个调用立即返回。

如果这不是问题,请记住提供计时输出(打印)对于破译调用时间和问题根源最有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.