一个C++基于boost简单实现的线程池

xl_blocking_queue.h

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

#ifndef SRC_COMMON_BLOCKING_QUEUE_H_

#define SRC_COMMON_BLOCKING_QUEUE_H_

#include <boost/thread.hpp>

#include <boost/noncopyable.hpp>

#include <queue>

template<typename T>

class xl_blocking_queue

  :boost::noncopyable

{

public:

  xl_blocking_queue()

    :mutex_(), queue_(), cond_()

  {

  

  }

  ~xl_blocking_queue(){}

  void put(const T& func)

  {

    boost::unique_lock<boost::mutex> lock(mutex_);

    queue_.push(func);

    cond_.notify_all();

  }

  T get()

  {

    boost::unique_lock<boost::mutex> lock(mutex_);

    if (queue_.size() == 0)

    {

      cond_.wait(lock);

    }

    T front(queue_.front());

    queue_.pop();

    return front;

  }

  unsigned size()

  {

    return queue_.size();

  }

  void notify_all()

  {

    cond_.notify_all();

  }

private:

  std::queue<T> queue_;

  boost::condition_variable_any cond_;

  boost::mutex mutex_;

};

#endif

xl_thread_pool.h

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

<strong>#ifndef SRC_COMMON_THREAD_POOL_H_

#define SRC_COMMON_THREAD_POOL_H_

#include <boost/thread.hpp>

#include <boost/shared_ptr.hpp>

#include <boost/noncopyable.hpp>

#include <vector>

#include "xl_blocking_queue.h"

typedef boost::function<void (void)> thread_do_func;

class xl_thread_pool

  :boost::noncopyable

{

public:

  xl_thread_pool(int thread_num)

    :num_(thread_num), run_(false)

  {

    

  }

  ~xl_thread_pool()

  {

    if (run_)

    {

      stop();

    }

  }

  void start()

  {

    if (num_ <= 0) return;

    int i = 0;

    run_ = true;

    for(i=0;i<num_;i++)

    {

      boost::shared_ptr<boost::thread> thread(new boost::thread(boost::BOOST_BIND(&xl_thread_pool::run, this)));

      thread_arr_.push_back(thread);

    }

  }

  void stop()

  {

    run_ = false;

    queue_.notify_all();

  }

  void post(const thread_do_func& task)

  {

    if (thread_arr_.size() == 0)

    {

      task();

    }

    else

    {

      queue_.put(task);

    }   

  }

private:

  xl_blocking_queue<thread_do_func> queue_;

  std::vector<boost::shared_ptr<boost::thread> > thread_arr_;

  int num_;

  bool run_;

  void run()

  {

    while(run_)

    {

      thread_do_func task = queue_.get();

      task();

    }

  }

};

#endif

时间: 2024-11-05 19:00:48

一个C++基于boost简单实现的线程池的相关文章

基于队列queue实现的线程池

本文通过文章同步功能推送至博客园,显示排版可能会有所错误,请见谅! 写在前文:在Python中给多进程提供了进程池类,对于线程,Python2并没有直接提供线程池类(Python3中提供了线程池功能),而线程池在并行中应用较广泛,因此实现一个进程池的功能十分必要.本文基于队列(queue)功能来实现线程池功能. 在Python3标准库中提供了线程池.进程池功能,推荐使用标准库. from concurrent.futures import ThreadPoolExecutor from conc

一个简单的python线程池框架

初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = "pandaychen" 5 6 import Queue 7 import sys 8 import os 9 import threading 10 import time 11

简单介绍一下线程池和数据库连接池的原理

当客户端请求的数据量比较大的时候,使用线程池可以节约大量的系统资源,使得更多的CPU时间和内存可以高效地利用起来.而数据库连接池的使用则将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量.使用情况等.本文我们主要就介绍一下线程池和数据库连接池的原理,接下来我们一起来了解一下这一部分内容. 线程池的原理: 其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某

[转]简单Linux C线程池

转自:http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html 贴原文章过来,提示有敏感词..那就不贴了. 以下为本博客作者注: 在threadpool_function函数中有这段代码, while ((pool->queue_cur_num == 0) && !pool->pool_close)   //队列为空时,就等待队列非空         {      pthread_cond_wait(&(p

简单实现java线程池

使用多线程以及线程池的意义无需多说,要想掌握线程池,最好的方法还是自己手动去实现. 一.实现思路      (网络盗图) 总的来说,所有的任务在BlockingQueue中进行等待,由Worker进行具体的操作,Worker才是真正的工作线程. 二.代码 1.线程池类 package com.ty.thread;import java.util.HashSet; import java.util.Set; import java.util.concurrent.BlockingQueue; im

最简单的C线程池简单Linux C

 http://weheartit.com/chengzhidun/collections/82197144 2015-01-14 http://weheartit.com/youdongfan/collections/82197139 2015-01-14 http://weheartit.com/meishici/collections/82197151 2015-01-14 http://weheartit.com/dengpanmeng/collections/82197156 20

自己实现一个简单线程池

先上原理图: 上代码之前,要先补充一下线程池构造的核心几个点 线程池里的核心线程数与最大线程数 线程池里真正工作的线程worker 线程池里用来存取任务的队列BlockingQueue 线程中的任务task 本例实现简化了一些,只实现了BlockingQueue存放任务,然后每个worker取任务并执行,下面看代码首先定义一个线程池ThreadExcutor class ThreadExcutor{ //创建 private volatile boolean RUNNING = true; //

简单实用可线上应用的线程池组件

0 前言 线程池的组件网上很多,之前我自己也尝试写个一个demo,但这些组件一般都比较简单,没有完整的实现后台线程池组件应用的功能.因此,这里我们实现一个可以用在线上环境的线程池组件,该线程池组件具备线程池应用的特性,如下所示: 1. 伸缩性:即线程池中线程的个数应该是动态变化的.繁忙的时候可以申请更多的线程:空闲的时候则注销一部分线程. 2. 线程状态:线程池中对线程的管理引入睡眠.唤醒机制.当线程没有任务在运行时,使线程处于睡眠状态. 3. 线程管理:对线程池中线程的申请和注销,不是通过创建

简单易用的线程池实现

0 前言 最近在写MySQL冷备server的一个模块,稍微接触到一点线程池的东西,自己也就想尝试写一个简单的线程池练练手. 这个线程池在创建时,即按照最大的线程数生成线程. 然后作业任务通过add_task接口往线程池中加入需要运行的任务,再调用线程池的run函数开始运行所有任务,每个线程从任务队列中读取任务,处理完一个任务后再读取新的任务,直到最终任务队列为空. 1 线程池设计 简单描述如下(假设任务类名为CTasklet): 1.CThreadPool<CTasklet> thread_