线程池

原创 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.");  
    }  

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

相关文章推荐

Android线程池+单例模式+webService

  • 2017年11月01日 10:36
  • 50.14MB
  • 下载

c++线程池操作

  • 2016年12月15日 11:27
  • 20.44MB
  • 下载

nodejs笔记之:事件驱动,线程池,非阻塞,异常处理等

事件驱动:事件驱动的模型: 事件驱动的原理: 原理总结: Nodejs 会把所有请求和异步操作都放到一个事件队列中,用户的每一个请求就是一个事件。主线程先把普通代码执行完毕,然后会循...

linux c 线程池

  • 2014年05月16日 21:53
  • 378KB
  • 下载

Android线程池(六)AbstractExecutorService类源码解析

ThreadPoolExecutor继承了AbstractExecutorService,而AbstractExecutorService又实现了ExecutorService接口。所以,根据多态,T...

多线程框架线程池编程

  • 2012年08月09日 17:11
  • 521KB
  • 下载

通用线程池

  • 2014年10月10日 16:31
  • 4KB
  • 下载

java四种线程池的使用

转载:http://www.cnblogs.com/SKILL0825/p/5971539.html JAVA4种线程池的使用 Java通过Executors提供四种线程池,分别为...

ThreadPoolExecutor线程池

  • 2012年08月30日 23:09
  • 22KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程池
举报原因:
原因补充:

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