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 (将#修改为@)