zoukankan      html  css  js  c++  java
  • libuv::线程池

    libuv提供了一个线程池,可用于运行用户代码并在循环线程中得到通知。该线程池在内部用于运行所有文件系统操作以及getaddrinfo和getnameinfo请求。
    其默认大小为4,但可以在启动时通过将UV_THREADPOOL_SIZE环境变量设置为任何值(绝对最大值为1024)来更改它 。
    线程池是全局的,并在所有事件循环之间共享。
    当特定的函数利用uv_queue_work()线程池时(即使用时),libuv预分配并初始化允许的最大线程数 UV_THREADPOOL_SIZE。
    这会导致相对较小的内存开销(128个线程约为1MB),但会在运行时提高线程性能。
    #include <cstdio>
    #include <stdio.h>
    #include <stdlib.h>
    #include <libuv/uv.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    long fib_(long t) {
        if (t == 0 || t == 1)
            return 1;
        else
            return fib_(t - 1) + fib_(t - 2);
    }
    
    void fib(uv_work_t* req) {
        int n = *(int*)req->data;
        if (random() % 2)
            sleep(1);
        else
            sleep(3);
        long fib = fib_(n);
        fprintf(stderr, "输入 %d 计算结果 %lu
    ", n, fib);
    }
    
    void after_fib(uv_work_t* req, int status) {
        fprintf(stderr, "输入 %d 已完成!
    ", *(int*)req->data);
    }
    
    int main() {
      //定义一个事件轮询
        uv_loop_t* loop = uv_default_loop();
        //将10个计算任务放入线程池中。
        int data[10];
        uv_work_t req[10];
        for (int i = 0; i < 10; i++) {
            data[i] = i;
            //传递任意参数
            req[i].data = (void*)&data[i];
           
            //libuv提供了线程池
            //但是只能同时执行4个(可以修改 UV_THREADPOOL_SIZE 环境变量设置)。
            //线程函数会在单独的线程中被启动, 并传入 uv_work_t 结构,
            //一旦函数返回, 就会调用 after_fib 函数, 同时也传入 uv_work_t 结构的指针.
            uv_queue_work(loop, &req[i], fib, after_fib);
        }
    
        return uv_run(loop, UV_RUN_DEFAULT);
    }
  • 相关阅读:
    SVN 使用教程
    MVC图片上传压缩
    MVC 上传下载压缩
    C# WinForm生成二维码,一维码,条形码 操作
    C#MVC生成二维码
    ajax post方式提交到.net core api
    .net core多文件上传 日志记录
    C# .net Core 文件上传
    C#.netmvc单文件上传 ajax上传文件
    详细的sql语句
  • 原文地址:https://www.cnblogs.com/osbreak/p/14092431.html
Copyright © 2011-2022 走看看