一个简单线程池例子

// Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <vector>

typedef unsigned (__stdcall*LP_THREAD_FUN)(void*);

class Thread{
public:
	Thread(){
		m_fun = NULL;
		m_param = NULL;
		m_hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, this, CREATE_SUSPENDED, NULL);
		printf("Thread Create: %08X\n", m_hThread);
	}
	~Thread(){
		Terminate();
		CloseHandle(m_hThread);
	}

	void SetThreadFun(LP_THREAD_FUN fun, void* param){
		m_fun = fun;
		m_param = param;
	}
	void Start(){
		DWORD dwCount = ResumeThread(m_hThread);
		if (dwCount == -1){
			printf("ResumeThread Fail, LastError: %d", GetLastError());
		}
	}
	void Pause(){
		DWORD dwCount = SuspendThread(m_hThread);
		if (dwCount == -1){
			printf("SuspendThread Fail, LastError: %d", GetLastError());
		}
	}
	void Resume(){
		DWORD dwCount = ResumeThread(m_hThread);
		if (dwCount == -1){
			printf("ResumeThread Fail, LastError: %d", GetLastError());
		}
	}
	void Terminate(){
		if (!TerminateThread(m_hThread, 0)){
			printf("TerminateThread Fail, LastError: %d", GetLastError());
		}
	}
protected:
	static unsigned __stdcall ThreadFun(void* param){
		Thread* p = (Thread*)param;
		if (p && p->m_fun)
		{
			p->m_fun(p->m_param);
		}
		return 0;
	}
	HANDLE m_hThread;
	LP_THREAD_FUN m_fun;
	void* m_param;
};

class ThreadPool{
public:
	ThreadPool(): m_iAvailableIndex(0){}
	~ThreadPool(){
		std::vector<Thread*>::iterator ita = m_vecThread.begin();
		while (ita != m_vecThread.end()){
			delete (Thread*)(*ita);
			ita++;
		}
		m_vecThread.clear();
	}

	void Init(int threadcount){
		m_vecThread.resize(threadcount);
		for (int i = 0; i < threadcount; ++i){
			m_vecThread[i] = new Thread;
		}
	}

	Thread* GetAvailabelThread(){
		if (m_iAvailableIndex < m_vecThread.size()){
			return m_vecThread[m_iAvailableIndex++];
		}
		return NULL;
	}

protected:
	std::vector<Thread*> m_vecThread;
	int m_iAvailableIndex;
};

unsigned __stdcall TestFun(void* p)
{
	printf("TestFun: %d", p);
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	ThreadPool pool;
	int count = 0;
	printf("Please input thread count: ");
	scanf("%d", &count);
	pool.Init(count);

	Thread* p = pool.GetAvailabelThread();
	if (p)
	{
		printf("Please input scedule thread: ");
		scanf("%d", &count);
		p->SetThreadFun(TestFun, (void*)count);
		printf("Run thread: ");
		scanf("%d", &count);
		p->Start();
	}

	system("@pause");
	return 0;
}

时间: 2024-11-08 01:15:47

一个简单线程池例子的相关文章

自己实现一个简单线程池

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

一个简单线程池的实现---需进一步完善

1.定义一个任务结构体,和一个线程池结构体 struct task{ void *(*p)(void*);//需要实现的函数: void *arg;//函数所带的参数 struct task *next;};struct pthread_pool{ pthread_mutex_t mutex;//线程锁 pthread_cond_t cond;//条件变量 pthread_t *tids;//线程id int thread_nums;//需创建的线程的数量 struct task *head;任

Linux多线程实践(9) --简单线程池的设计与实现

线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同

Linux下简单线程池的实现

线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同

Java一个简单的死锁例子

内容:一个简单的死锁例子,大概的思路:两个线程A和B,两把锁X和Y,现在A先拿到锁X,然后sleep()一段时间,我们知道sleep()是不会释放锁资源的.然后如果这段时间线程B拿到锁Y,也sleep()一段时间的话,那么等到两个线程都醒过来的话,那么将互相等待对方释放锁资源而僵持下去,陷入死锁.flag的作用就是让A和B获得不同的锁. public class TestDeadLock { public void run() { MyThread mt = new MyThread(); ne

简单线程池的实现

1. 什么是线程池 线程池是线程的集合,拥有若干个线程,线程池中的线程一般用于执行大量的且相对短暂的任务.如果一个任务执行的时间很长,那么就不适合放在线程池中处理,比如说一个任务的执行时间跟进程的生命周期是一致的,那么这个线程的处理就没有必要放到线程池中调度,用一个普通线程即可. 线程池中线程的个数太少的话会降低系统的并发量,太多的话又会增加系统的开销.一般而言,线程池中线程的个数与线程的类型有关系,线程的类型分为 1.     计算密集型任务: 2.     I/O密集型任务. 计算密集型任务

LINUX下的简单线程池

前言 任何一种设计方式的引入都会带来额外的开支,是否使用,取决于能带来多大的好处和能带来多大的坏处,好处与坏处包括程序的性能.代码的可读性.代码的可维护性.程序的开发效率等. 线程池适用场合:任务比较多,需要拉起大量线程来处理:任务的处理时间相对比较短,按照线程的周期T1(创建阶段).T2(执行阶段).T3(销毁阶段)来算,执行阶段仅占用较少时间. 简单的线程池通常有以下功能:预创建一定数量的线程:管理线程任务,当工作线程没有事情可做时休眠自己:销毁线程池. 复杂一些的线程池有额外的调节功能:管

C++版简单线程池

需求 之前写过一个C#版本的简单线程池http://blog.csdn.net/ylbs110/article/details/51224979 由于刚刚学习了C++11新特性中的future,于是想到用它来实现一个线程池. 实现 思路基本和C#版本的一样,主要区别是委托的实现,线程句柄的不同和线程锁: 本来C++有function模板,但是实现起来比较麻烦,这里主要是实现线程池,所以动态参数的委托就不实现了,直接使用typedef void(*Func)();来实现一个无参数无返回值的函数指针

使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Networking做一个简单的多人游戏例子-3/3 7. 在网络中控制Player移动 上一篇中,玩家操