博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++11最简单的线程池实现
阅读量:4222 次
发布时间:2019-05-26

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

线程池是在处理高并发任务中有比较重要的价值,他的实现最基本原理就生产者和消费者模型,刚开始就开一定数量的线程,以程序中的某些功能模块为对象,以生产者与消费者模型为基本原理,不断使用这些固定数量的线程调度进行处理,避免了在高并发情况下,不断开辟线程造成的进程资源消耗.下面是一个简单的线程池程序,主要使用C++11中一些简单的新特性的最简单的线程池实现.

ThreadPool.h

#pragma once#include 
#include
#include
#include
#include
#include
#include
#include
#define N 10using namespace std;class ThreadPool{public: //自定义void()的函数类型 typedef function
Task; ThreadPool(); ~ThreadPool(); public: size_t initnum; //线程数组 vector
threads ; //任务队列 queue
task ; //互斥锁条件变量 mutex _mutex ; condition_variable cond ; //线程池工作结束时为真 bool done ; //队列是否为空 bool isEmpty ; //队列是否为满 bool isFull;public: void addTask(const Task&f); void start(int num); void setSize(int num); void runTask(); void finish();};

ThreadPool.cpp

#include"ThreadPool.h"ThreadPool ::ThreadPool():done(false),isEmpty(true),isFull(false){}//设置池中初始线程数void ThreadPool::setSize(int num){        (*this).initnum = num ;}//添加任务void ThreadPool::addTask(const Task&f){       if(!done){        //保护共享资源            unique_lock
lk(_mutex); //要是任务数量到了最大,就等待处理完再添加 while(isFull){ cond.wait(lk); } //给队列中添加任务 task.push(f); if(task.size()==initnum) isFull = true; cout<<"Add a task"<
lk(_mutex); //队列为空的话,就等待任务 while(isEmpty){ cond.wait(lk); } Task ta ; //转移控制快,将左值引用转换为右值引用 ta = move(task.front()); task.pop(); if(task.empty()){ isEmpty = true ; } isFull =false ; ta(); cond.notify_one(); }}void ThreadPool::start(int num){ setSize(num); for(int i=0;i

Test.cpp

#include 
#include"ThreadPool.h"void func(int i){ cout<<"task finish"<<"------>"<
<

运行截图

在这里插入图片描述

原帖:

 

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

你可能感兴趣的文章
Android Rxjava:这是一篇 清晰 & 易懂的Rxjava 入门教程
查看>>
Android自定义View的三种实现方式
查看>>
码流 / 码率 / 比特率 / 帧速率 / 分辨率 / 高清的区别
查看>>
IP分配及网段划分
查看>>
EventBus接收不到事件(debug版本可以接收,release接收不到)
查看>>
Android UI开发——Material Design界面设计风格
查看>>
简单工厂模式
查看>>
迭代器模式
查看>>
HashMap、ConcurrentHashMap和SynchronizedMap – 哈希表在Java中的多线程同步处理
查看>>
Lock和synchronized比较详解
查看>>
H264码流中SPS、PPS详解
查看>>
Android三种动画实现原理及使用
查看>>
Android Auto 架构了解
查看>>
Linux下使用putty进行UART串口调试
查看>>
WebSocket
查看>>
彻底理解cookie,session,token
查看>>
Binder机制的原理
查看>>
Android系统启动过程从下往上的一个过程
查看>>
AndroidStudio导入工程同步出现的问题
查看>>
Sweet Snippet 之 字符串编辑距离
查看>>