线程池

原创 2016年08月30日 14:11:26
#include<stdio.h>  
#include<pthread.h>
#include<string>
#include<iostream>
using namespace std;
static pthread_mutex_t m_pthreadMutex = PTHREAD_MUTEX_INITIALIZER;    /** 线程同步锁 */
static pthread_cond_t m_pthreadCond = PTHREAD_COND_INITIALIZER;      /** 线程同步的条件变量 */

#define MAX_NUM_THREAD 50; 
pthread_t pthread_id[MAX_NUM_THREAD] = {0};
Mutex_Guard mutex_guard(m_pthreadCond); 
class Task
{
public:
	Task(){}
	virtual ~Task()
	virtual int run() = 0;	
};
class TaskSend:public Task  
{
	TaskSend(){}
	~TaskSend(){}
	int run();
	
};
int TaskSend::run()
{
	const int n = 100;
	int s = 0;
	for (int i = 0;i < n; ++i)
		
	
	
	
}

class ThreadPool
{
public:
    ThreadPool(){}
	ThreadPool(int NumofThd){};
	~ThreadPool(){};
	static ThreadPool* GetInstace();
	void InitThreadPool();
	static void StartProcess();
	void AddTask();
	void Stop(){};
private:
    int m_numThd;// num of thread;
	static ThreadPool* m_instance;
    //static Mutex_Guard mutex_guard; //因为回调函数StartProcess必须是static的,所以所有该函数要调用的成员变量也要是static
	static vector<Task*> m_oVecTask;

};

   cPP文件定义如下:
  ThreadPool* ThreadPool::m_instance = NULL;
  
 //静态成员变量要在类外面定义
pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALZER;
//Mutex_Guard ThreadPool::mutex_guard(thread_mutex);
vector<Task*> ThreadPool::m_oVecTask;

void ThreadPool::ThreadPool(int NumofThd)
{
	m_numThd = NumofThd;
	InitThreadPool();
}
ThreadPool* ThreadPool::Instace(n)
{
	if (NULL == m_instance)
	{
		m_instance = new(std::nothrow) ThreadPool(n);	
	}
	return m_instance;
}
void ThreadPool::InitThreadPool()
{
	for(int i = 0; i < m_iThreadNum; i++)
	{
		pthread_create(&pthread_id[i], NULL, StartProcess, NULL);
	}
	return ;
}
void ThreadPool::StartProcess()
{
	pthread_t tid = pthread_self();
	while(1)
	{
		Mutex_Guard mutex_guard(m_pthreadCond);
		if (0 == m_oVecTask.size())
		{
			pthread_cond_wait(&m_pthreadCond, &m_pthreadCond);
		}
		vector<Task*>::iterator itTask = m_oVecTask.begin();
		
	}
	return ;
}

void ThreadPool::AddTask(const Task& t)
{
	Mutex_Guard mutex_guard(m_pthreadCond); 
	m_oVecTask.push_back(t);
	pthread_cond_siganl(&m_pthreadCond);
}
int main()
{
	
	//初始化线程池
	(void)ThreadPool::Instace(20);
	
	//应用如下:
	ThreadPool::Instace()->StartProcess();
	
	return 0;
}

class Mutex_Guard
{
 public:
  Mutex_Guard(){mutex = 0;}
  Mutex_Guard(pthread_mutex_t& mutex_other)
  {   
     mutex = mutex_other; 
    int val = 0;
	val = pthread_mutex_lock(&mutex);/*lock the mutex*/  
    if(val != 0)  
    {  
        printf("lock error.");  
    } 	   
  }
  ~Mutex_Guard()
  {
	int val = 0; 
	val = pthread_mutex_unlock(&mutex);/*unlock the mutex*/  
    if(val != 0)  
    {  
        printf("lock error.");  
    }  
  }
private:
  Mutex_Guard(){}
  Mutex_Guard(const Mutex_Guard& t2){}

  Mutex_Guard& operator =(const Mutex_Guard& t2){}

private:
   pthread_mutex_t mutex;
};


	static pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALZER;

    if(pthread_mutex_init(&mutex,NULL) != 0 )  
    {  
        printf("Init metux error.");  
        exit(1);  
    }
	 pthread_mutex_unlock(&mutex);/*unlock the mutex*/ 
	 val = pthread_mutex_lock(&mutex);/*lock the mutex*/  
		 if(val != 0)  
    {  
        printf("lock error.");  
    }  

版权声明:本文为博主原创文章,未经博主允许不得转载。

线程池的理解及使用

1.初识线程池:根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行。2....
  • Syoung99
  • Syoung99
  • 2016年09月13日 15:40
  • 22506

自己手动写个线程池

前言:   要自定义一个线程池,首先要有存固定的线程数目的阻塞队列,还要有个存放任务的阻塞队列。   如果任务放入时有线程为空闲直接交付于它执行否则就放入任务队列中   在内部有个线程会不断的扫...
  • yinbucheng
  • yinbucheng
  • 2016年07月26日 15:03
  • 578

深入解析线程池的使用

为什么需要线程池 目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。  传 统多线程方案中我...
  • u010984552
  • u010984552
  • 2016年07月12日 11:02
  • 3379

线程池(ThreadPoolExecutor JDK1.7)

平常我们经常都会使用到线程池,但是有没考虑过为什么需要使用线程池呢?下面我列举一下问题,大家可以思考一下 1.当前服务器的硬件环境是多少核的CPU,它和线程的关系又是什么? 2.jvm能...
  • wojiaolinaaa
  • wojiaolinaaa
  • 2016年05月08日 15:17
  • 4255

JDBC 线程池

public class ConnectionPool { private String driver; private String url; private String...
  • lezong2011
  • lezong2011
  • 2015年04月02日 17:01
  • 1305

Java线程池原理及四种线程池的使用

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFi...
  • honghailiang888
  • honghailiang888
  • 2016年06月16日 11:36
  • 4228

IOS-线程、线程池

一、 当一个程序开启时,系统就自动为程序创建了一个主线程,在主线程中,所有的操作都是同步执行的 所以有可能造成“界面假死”,因为当在主线程里执行计较耗时的操作是,主线程需要等待操作的完成,比如一个...
  • u012360598
  • u012360598
  • 2014年12月14日 15:19
  • 1279

Java多线程总结(6)— 线程池的基本使用和执行流程分析

1 线程池的实现原理及基本类结构  合理利用线程池能够带来三个好处。 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立...
  • Mark_LQ
  • Mark_LQ
  • 2015年12月18日 21:36
  • 6014

Linux线程池使用实例

tpool.h #ifndef _THREAD_POOL_H #define _THREAD_POOL_H struct job { void* (*callback_function)(v...
  • szkbsgy
  • szkbsgy
  • 2014年05月18日 11:43
  • 1042

任务,线程和同步(四)之ThreadPool(线程池)

线程池任务后台基础:线程池。创建线程需要时间。如果有不同的短任务要完成,就可以事先创建许多线程,在应完成这些任务时发出请求,这个线程最好在需要更多的线程时增加,在需要释放资源时减少。 不需要自己创建...
  • younghaiqing
  • younghaiqing
  • 2017年02月24日 16:16
  • 655
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程池
举报原因:
原因补充:

(最多只允许输入30个字)