博客
关于我
C++11创建一个跨平台线程池
阅读量:165 次
发布时间:2019-02-26

本文共 2401 字,大约阅读时间需要 8 分钟。

实现一个简单的线程池

看完《Windows核心编程》的“线程池”这一章后,我只学到了几个Windows线程池相关的API,并没有深入了解线程池的实现细节。尤其是每次编写多线程任务时都手动管理线程,确实让人觉得有点手痒。后来想起了祁宇老师的《深入应用C++11》,在书中找到了一章关于“使用C++11实现一个线程池”的内容,于是按照书中的代码在VS下编写了一个简单的线程池,成功运行后倍感兴奋。

接着,我又开始思考,如果将这个纯C++实现的线程池放到Linux下,是否也能运行呢?于是,在Linux环境下尝试了一番,今天终于实现了!以下是我在VS2015和Linux g++5.4.0下实现线程池的整个过程。


线程池的实现原理

线程池的实现通常包括三层:同步服务层排队层异步服务层。这也是一种典型的生产者-消费者模式。具体来说:

  • 同步服务层:负责接收新任务,保证任务的安全性。
  • 排队层:作为一个同步队列,确保生产者和消费者能够安全地共享数据,同时防止任务数量无限制增长。
  • 异步服务层:由线程池预先创建的线程负责从排队层中取任务执行。

线程池还需要提供一个停止接口,让用户能够在需要时停止线程池的运行。


Windows平台运行

环境配置

  • 硬件:通过cmd运行systeminfo可以查看CPU信息。我的开发机上配备了Intel64 Family 6 Model 58 Stepping 9 GenuineIntel,四核处理器(通过Process Explorer查看cores数量)。
  • 软件:Windows10 X64 + VS2015。
  • 工程创建

  • 使用VS2015新建一个Win32 console工程,选择空项目,命名为ThreadPool
  • 从GitHub下载SyncQueue.hppThreadPool.hpp,并将这两个文件添加到项目中。
  • 添加一个main.cpp文件用于测试。由于没有找到合适的测试代码,我参考书中的内容并进行了修改。
  • #include "ThreadPool.hpp"int main() {    ThreadPool pool;    std::thread thd1([&pool] {        for (int i = 0; i < 10; ++i) {            auto thdId = this_thread::get_id();            pool.AddTask([thdId] {                cout << "同步层1 thread ID : " << thdId << endl;            });        }    });    std::thread thd2([&pool] {        for (int i = 0; i < 10; ++i) {            auto thdId = this_thread::get_id();            pool.AddTask([thdId] {                cout << "同步层2 thread ID : " << thdId << endl;            });        }    });    this_thread::sleep_for(std::chrono::seconds(2));    cout << "清空线程池..." << endl;    pool.Stop();    thd1.join();    thd2.join();    cout << "主线程已过..." << endl;    this_thread::sleep_for(std::chrono::seconds(5));    return 0;}

    运行效果

    运行后,会看到两个线程分别执行任务,输出各自的线程ID。线程池在停止后,所有线程也会正确退出。


    Linux平台运行

    环境配置

  • 我在VMware虚拟机上运行Ubuntu,环境参数如下:
    • CPU:Intel Cores数量(通过process explorer查看)
    • 操作系统:Ubuntu 16.04.2
  • 工程创建

  • 在Linux上创建一个文件夹ThreadPool,将SyncQueue.hppThreadPool.hppmain.cpp拷贝到该文件夹中。
  • 运行ls Threadpool可以确认文件是否存在。
  • 编译

  • 错误一:直接运行g++ -o Threadpool main.cpp,会报好几屏错误,提示没有选择C++11支持。
  • 错误二:加上-std=c++11后,仍然有错误,提示undefined reference to 'pthread_create'
  • 通过搜索关键词undefined reference to 'pthread_create',我了解到在Linux下,pthread不是默认库,需要在编译时添加-pthread选项。具体来说,新版的gcc需要使用-pthread,而旧版本可能需要-lpthread。经过测试,发现新版本的gcc确实需要-pthread


    最终编译命令

    g++ -std=c++11 -pthread -o Threadpool main.cpp

    运行./Threadpool后,会看到两个线程分别执行任务,输出各自的线程ID。线程池停止后,所有线程也会正确退出。


    总结

    通过这次项目,我对线程池有了更深入的理解,特别是C++11在多线程编程中的优势。将同一段代码从Windows转到Linux,过程中遇到的pthread库问题让我对Linux开发有了更深的印象。未来,我计划进一步优化线程池的性能和功能,比如增加线程池的可扩展性和任务优先级的支持。

    转载地址:http://mdqu.baihongyu.com/

    你可能感兴趣的文章
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nginx配置文件nginx.conf中文详解(总结)
    查看>>
    Nginx配置负载均衡到后台网关集群
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>