Libcurl - curl_multi_wakeup
Posted
技术标签:
【中文标题】Libcurl - curl_multi_wakeup【英文标题】: 【发布时间】:2021-12-31 20:12:13 【问题描述】:读取函数说明 curl_multi_wakeup:enter link description here
调用这个函数只保证唤醒当前(或 接下来如果没有当前的) curl_multi_poll 调用,这意味着它是 多次调用此函数可能会唤醒相同的 等待操作。
我对“相同的等待操作”这个短语感到困惑。怎么样?
也就是说,假设我在线程“A”中有一个处于事件待机模式的函数 curl_multi_poll()。
现在,例如,我从线程“B”和线程“C”调用 curl_multi_wakeup() 函数两次。
从这句话判断会发生什么:
...函数将唤醒相同的等待操作。
原来函数 curl_multi_poll - 只唤醒一次?
【问题讨论】:
我不熟悉这个库,所以我不会回答,但想象一下在线程 A 有机会唤醒一次之前,在循环中调用curl_multi_wakeup
1000 次。我认为文档是说这 1000 个呼叫只会唤醒单个 curl_multi_poll
呼叫,而不是接下来的 1000 个呼叫。
阅读此链接:daniel.haxx.se/blog/2019/12/09/this-is-your-wake-up-curl。你不应该在多个线程中调用它 1000 次。关键是您只能在异常情况下调用 curl_multi_wakeup()。
@FoggyDay,您似乎不明白为什么需要 curl_multi_wakeup - 我必须并且会从不同的线程调用它 1000 次 - 这就是 curl_multi_wakeup 的创建目的。
不,你不明白你的设计看起来有严重缺陷......
【参考方案1】:
curl_multi_wakeup
旨在与等待curl_multi_poll
的线程池一起使用。
文档说的是,如果你反复调用curl_multi_wakeup
,它可能只会唤醒一个线程,不一定每次调用 curl_multi_wakeup 一个线程。
【讨论】:
文档根本没有说线程的唤醒,所以说的是curl_multi_poll函数()的唤醒。 我有 10 个线程,每个线程都在运行 curl_easy_perform/curl_multi_poll 的无限循环。 对不起,我不明白。这是什么意思 - “单个回调上的多个事件。”。我需要唤醒 curl_multi_poll - 为了执行一个功能或 curl_multi_remove_handle 或 curl_multi_add_handle 或者其他一些,就是这样。 curl_multi_poll 返回需要注意的 fd 的数量作为最后一个参数 - 仅当他自己返回时,而不是在调用之后 - curl_multi_wakeup。 fds 的数量 - 这与我的问题无关。 假设我有 10 个线程和 10 个无限循环,现在假设所有请求都已完成并且 curl_multi_poll 函数正在等待。现在的问题是:如果 curl_multi_poll - 阻塞了线程,我如何向 multi_handle 添加一个新的 CUrl_easy 句柄?唯一的解决方案是调用 curl_multi_wakeup 函数,以便唤醒 curl_multi_poll 函数并解锁循环。但是有一个问题是两次调用 curl_multi_wakeup - 根据文档 - 只能唤醒 curl_multi_poll 一次。【参考方案2】:curl_multi_poll() 是一个相对较新的调用,旨在简化等待 curl_multi_poll() 的“中断”线程。这是一个很好的解释:
https://daniel.haxx.se/blog/2019/12/09/this-is-your-wake-up-curl/
curl_multi_poll() [是一个]函数,它要求 libcurl 等待任何 涉及转移 - 或睡眠并且不返回下一个 N 毫秒。
调用这个等待函数(或使用旧的 curl_multi_wait() 或 甚至“手动”执行 select() 或 poll() 调用)对于 行为良好的程序。让代码进入休眠状态很重要 像这样当无事可做并让系统唤醒它时 当它需要工作时再次。未能正确执行此操作,风险 在某处使用 libcurl 而不是忙循环,这可以使您的 应用程序在期间使用 100% CPU。这是非常不必要的 并且由于多种原因而不好。
当...发生某些事情并且应用程序需要 立即关闭,用户一直在寻求一种唤醒方式 接电话。
curl_multi_wakeup() 显式创建 curl_multi_poll() 函数 立即返回。它被设计成可以从一个使用 不同的线程。
【讨论】:
以上是关于Libcurl - curl_multi_wakeup的主要内容,如果未能解决你的问题,请参考以下文章