问题描述
我认为使用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 (将#修改为@)