请选择 进入手机版 | 继续访问电脑版
开启辅助访问
QQ登录|微信登录|登录 |立即注册

盖茨网区块链技术社区

libuv库的最基本使用方法

  1. libuv的使用:
  2. //(1)创建                        uv_async_t async;
  3. //                                        uv_loop_t* loop = uv_default_loop();
  4. //(2)开启主线程        uv_async_init(loop, &async, uv_asynccb);---》(void uv_asynccb(uv_async_t* handle))
  5. //(3)激活持有async的队列        uv_async_send(&async);
  6. //(4)循环队列                uv_run(loop, UV_RUN_DEFAULT);
  7. //(5)清楚指针                uv_loop_close(uv_default_loop());

  8. //线程使用:
  9. //(1)创建句柄                uv_thread_t thread;
  10. //(2)创建线程                uv_thread_create(&thread, sub_thread, (void *)&async);
  11. //(3)回收                        uv_thread_join(&thread)

  12. //工作队列使用
  13. //(1)创建句柄                uv_work_t req;
  14. //(2)创建工作                uv_queue_work(loop, &req, callback, finishcallback)

  15. //定时器使用
  16. //(1)创建句柄                uv_timer_t m_timer;
  17. //(2)创建定时器回掉 uv_timer_start(&m_timer, handle, timeout, repalce);
  18. //(3)回收                        uv_timer_stop(&m_timer)

  19. //DNS查询
  20. //(1)创建句柄                uv_getaddrinfo_t resolver
  21. //(2)解析   int r = uv_getaddrinfo(loop, &resolver, on_resolved, "irc.freenode.net", "6667", struct addrinfo*);
  22. //回掉void on_resolved(uv_getaddrinfo_t *resolver, int status, struct addrinfo *res)--》你可以在struct addrinfo(s) 结构的链表中任取一个 IP
  23. //(3)返回值        返回非0解析出错,回掉不会调用,所有参数回值返回后释放
复制代码
直接从代码的角度讲解
(1)uv_async_init队列进程
  1. void uv_asynccb(uv_async_t* handle)
  2. {
  3.         printf("async_cb called!\n");
  4.         uv_thread_t id = uv_thread_self();
  5.         printf("thread id:%lu.\n", id);
  6. uv_close((uv_handle_t*)handle, NULL);//从队列中删除本任务,程序会直接退出
  7.         //uv_async_send(handle);//若不删除任务,再次激活程序会陷入循环
  8. }
  9. int main(int argc, char* argv[])
  10. {
  11.         uv_async_t async;//创建句柄
  12.         uv_loop_t* loop = uv_default_loop();
  13.         uv_thread_t id = uv_thread_self();
  14.         printf("thread id:%lu.\n", id);//得到自身TID

  15.         uv_async_init(loop, &async, uv_asynccb);//投入队列
复制代码
执行结果:
  1. thread id:0
  2. thread id:0
复制代码
可见uv_async_init并不会创建线程,程序还是同一个线程


(2)线程使用:
  1. void sub_thread(void* arg)
  2. {
  3.         uv_thread_t id = uv_thread_self();
  4.         printf("sub thread id:%lu.\n", id);
  5. }

  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8.         uv_thread_t thread;
  9.         uv_loop_t* loop = uv_default_loop();
  10.        
  11.         uv_thread_t id = uv_thread_self();
  12.         printf("thread id:%lu.\n", id);

  13.         //创建子线程(子线程不等于队列,线程thread_t是不一样的)
  14.         uv_thread_create(&thread, sub_thread, NULL);
  15.         uv_run(loop, UV_RUN_DEFAULT);
  16.         uv_loop_close(uv_default_loop());
  17.         return 0;
  18. }
复制代码
执行结果
  1. thread id:0
  2. sub thread id:456
复制代码
tid不同,创建了线程,且程序直接返回

(3)定时器
  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3.         uv_timer_t m_timer;
  4.        
  5.         uv_thread_t id = uv_thread_self();
  6.         printf("thread id:%lu.\n", id);
复制代码
执行结果
  1. thread id:0
  2. thread id:453
  3. thread id:453
  4. thread id:453
  5. 。。。
复制代码
定时器也为线程运行,代码中
  1. [](uv_timer_t* handle)
  2. {
  3. printf("======TIME========!\n");
  4. uv_thread_t id = uv_thread_self();
  5. printf("thread id:%lu.\n", id);
  6. }
复制代码
上述写法是在调用时对函数进行实现
(4)工作队列
  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3.         uv_async_t async;
  4.         uv_work_t req;
  5.         uv_loop_t* loop = uv_default_loop();
  6.        
  7.         uv_thread_t id = uv_thread_self();
  8.         printf("thread id:%lu.\n", id);

  9.         uv_queue_work(loop, &req, [](uv_work_t* handle)
  10.                                                 {
  11.                                                         printf("async_cb called2!\n");
  12.                                                         uv_thread_t id = uv_thread_self();
  13.                                                         printf("thread id:%lu.\n", id);
  14.                                                 }
  15.                                         , NULL);
  16.         uv_run(loop, UV_RUN_DEFAULT);
  17.         uv_loop_close(uv_default_loop());
  18.         return 0;
  19. }
复制代码
执行结果同定时器

DNS解析
  1. #include <iostream>
  2. #include <string>
  3. #include <uv.h>
  4. using namespace std;

  5. //回掉函数
  6. void callback(uv_getaddrinfo_t* req, int status, struct addrinfo* res){
  7.         cout << "status: " << status << endl;
  8.         while (res)
  9.         {
  10.                 struct sockaddr_in* addr = (struct sockaddr_in*)res->ai_addr;//从res得到解析结果
  11.                 cout << "addr: " << inet_ntoa(addr->sin_addr) << " : " << ntohs(addr->sin_port) << endl;//打印端口和IP
  12.                 res= res->ai_next;
  13.         }
  14.         uv_freeaddrinfo(res);//必须释放
  15. }

  16. int main(int argc, char* argv[])
  17. {
  18.         uv_loop_t* loop = uv_default_loop();
  19.         uv_getaddrinfo_t uv_req;//创建句柄

  20.         int r = uv_getaddrinfo(uv_default_loop(), &uv_req, callback, "www.baidu.com", NULL, NULL);//解析DNS
  21.         if (r) {
  22.                 cout << "dns:error" << endl;
  23.                 return 1;
  24.         }
  25.         uv_run(loop, UV_RUN_DEFAULT);
  26.         uv_loop_close(uv_default_loop());
  27.         return 0;
  28. }
复制代码
执行结果
  1. status: 0
  2. addr: 180.97.33.108 : 0
  3. addr: 180.97.33.108 : 0
  4. addr: 180.97.33.108 : 0
  5. addr: 180.97.33.107 : 0
  6. addr: 180.97.33.107 : 0
  7. addr: 180.97.33.107 : 0
复制代码





0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则