• 基于Arrow的轻量线程池


    基于Arrow的轻量线程池

    大家好,我是光城,最近花了几周业余时间,开发出这款轻量线程池,代码也全部开源啦,欢迎大家star。

    本线程池的设计与实现会有涉及非常多的知识,这些内容也都会以视频的方式分享在知识星球中,随便一罗列就是一大堆,在学习本线程过程中你会学到:

    - 如何从0构建一个项目

    - 如何使用bazel管理整个项目

    - 如何设计一个属于自己的线程池

    - Arrow 项目与现在的线程池区别在哪里,我们做了什么改造

    - 如何实战并发编程

    - 如何做测试

    等等。

    a9f361d6149ea9de8127a773eeed1859.jpeg

    本线程池是基于Apache Arrow项目的衍生版本。我们将Arrow项目中复杂的核心结构——线程池——完全剥离出来,形成了这个独立的项目。由于原始的线程池与Arrow项目本身的工具有深度依赖关系,因此我们在这个项目中对线程池进行了一些深度移除和改造,以保持与原始Arrow线程池的基础功能一致。一些改动包括:

    • 将Arrow的Future替换为std::future

    • 将Arrow的Result替换为std::optional

    • 重构了Submit接口,使用promise进行实现

    通过这些改动,我们的目标是:

    • 使线程池更方便地作为其他项目的依赖库使用

    • 提供简单的方式来引入本项目的so库和头文件,以使用线程池功能

    此外,这个项目还可以作为深入学习线程池设计与实现的资源。我们欢迎您探索并使用这个经过精心改进的线程池。

    项目地址:参考下面

    https://github.com/Light-City/light-thread-pool

    1.如何编译

    1. ➜ tpl bazel build //src:thread_pool
    2. WARNING: Ignoring JAVA_HOME, because it must point to a JDK, not a JRE.
    3. WARNING: Ignoring JAVA_HOME, because it must point to a JDK, not a JRE.
    4. INFO: Analyzed target //src:thread_pool (36 packages loaded, 168 targets configured).
    5. INFO: Found 1 target...
    6. Target //src:thread_pool up-to-date:
    7.   bazel-bin/src/libthread_pool.a
    8.   bazel-bin/src/libthread_pool.dylib
    9. INFO: Elapsed time: 1.748s, Critical Path: 1.34s
    10. INFO: 8 processes: 3 internal, 5 darwin-sandbox.
    11. INFO: Build completed successfully, 8 total actions

    2.如何使用

    所有的用例放在examples目录

    2.1 编写一个简单的case

    参见:helloworld

    1. // Create a thread pool
    2. auto threadPool = GetCpuThreadPool();
    3. if (!threadPool) {
    4.   std::cerr << "Failed to create thread pool" << std::endl;
    5.   return 1;
    6. }
    7. // Submit tasks to the thread pool
    8. threadPool->Spawn([]() { std::cout << "hello world!" << std::endl; });
    9. // Wait for all tasks to complete
    10. threadPool->WaitForIdle();
    11. // Shutdown the thread pool
    12. threadPool->Shutdown();

    其他case:

    • 设置线程池数量

    • 如何停止回调

    • 如何异步处理

    3.如何测试

    测试基于catch2编写,所有测试位于tests目录

    可以测试tests目录下面的其他测试,只需要替换submit_test为对应的test即可。

    bazel test //tests:submit_test
  • 相关阅读:
    基于微信电影播放小程序系统设计与实现 开题报告
    BI数据可视化:不要重复做报表,只需更新数据
    用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发
    c语言:解决数组元素右旋问题,时间复杂度O(N)
    tkinter绘制组件(31)——支点标题
    Android 动画
    C++ Reference: Standard C++ Library reference: C Library: cstring: strchr
    redis和mysql数据一致性方案
    ZGC的流程图
    【JavaWeb从零到一】会话技术Cookie&Session&JSP
  • 原文地址:https://blog.csdn.net/guangcheng0312q/article/details/133917697