如何解决libuv libcurl示例错误
我认为使用libuv示例https://curl.haxx.se/libcurl/c/multi-uv.html
的libcurl中几乎没有错误。int main(int argc,char **argv)
{
loop = uv_default_loop();
if(argc <= 1)
return 0;
if(curl_global_init(CURL_GLOBAL_ALL)) {
fprintf(stderr,"Could not init curl\n");
return 1;
}
uv_timer_init(loop,&timeout);
curl_handle = curl_multi_init();
curl_multi_setopt(curl_handle,CURLMOPT_SOCKETFUNCTION,handle_socket);
curl_multi_setopt(curl_handle,CURLMOPT_TIMERFUNCTION,start_timeout);
while(argc-- > 1) {
add_download(argv[argc],argc);
}
uv_run(loop,UV_RUN_DEFAULT);
curl_multi_cleanup(curl_handle);
return 0;
}
首先:
当循环中没有活动句柄时,将调用uv_run(loop,UV_RUN_DEFAULT);
,因此它将立即返回。
UV_RUN_DEFAULT:运行事件循环,直到不再有活动和 引用的句柄或请求。如果uv_stop()为,则返回非零 被调用,并且仍然有活动的句柄或请求。返回零 其他所有情况。
所以,如果示例可行,是因为我们在超时回调和uv_run之间具有运行条件。
第二:
start_timeout
是从uv_run
之外的另一个线程调用的。因此,正如作者在该主题中提到的,https://github.com/libuv/libuv/issues/1153这是错误的。
通过这种方式,uv_timer_start
正在从另一个线程进行调用,这导致在下次循环交互之前,计时器将不再处于警戒状态。 (循环超时在每次循环交互中都会更新,而uv_timer_start不会强制这样做)。
相同的行为适用于uv_loop_t对象,直到下次循环交互时,它们才会包含在epoll中(在unix情况下)。
令我感到困惑的是,libuv文档中以这种方式进行了解释。 http://docs.libuv.org/en/v1.x/guide/utilities.html#external-i-o-with-polling
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。