一个简单的线程管理方式。

文章来源: www.17173.com

周末,总是有点那么的无聊。闲来没事,想想每次自己要进行多线程编程时的痛苦,也并借机考虑设计了一个简单的线程管理方式。 

    没什么好说的,首先想想线程的创建,每次都要CreateThread,传递一堆的参数,还得没事查查MSDN,唉,效率低啊。反正,对于我来说,线程基本都是缺省优先级、缺省安全的。不如把这些一起封装了。

    不多说,C++不用对象机制用什么?顺便借鉴一下java。来个实际线程就是run,启动采用start。

class thread

{

public:

     thread( void );

     virtual ~thread( void );

 

     virtual void run() = 0;

 

     void start();

};

     这个也就是最基本的,基于对象的线程基类了。子类只需要实现run作为线程,调用start,就可以启动线程了。线程的所需参数,很简单,基于对象,有需要的,做为扩展类的成员变量——成员资源来访问。

    就这么简单?线程访问最大的问题——资源共享。那好,很容易想到互斥量。还有java的关键字synchronized,我们也就加一个锁的概念。

class thread

{

public:

     thread( void );

     virtual ~thread( void );

 

     virtual void run() = 0;

 

     void start();

 

     static void syncLock( void *res,bool lock );

};

    这样,在最基本的线程资源——HANDLE,就可以被管理了,资源的访问也可以通过lock和unlock来保护了。

    实际中,很多时候,我们希望能限制或知道有多少线程在运行,那么再加一个运行线程记数功能。大多时候,往往是采用线程池,而且会根据CPU数目,决定运行的线程数目。我们干脆,再提供一个功能,限制对象上可以允许同时运行的线程数目。那好,改为(同时加上一些保护和注解):

typedef unsigned int U32;

/**

 * 线程对象

 * 提供基于对象的线程处理接口

 */

class thread

{

public:

     /**

      * 线程基于对象的构造

      * para max 允许最多同时运行线程数

      */

     explicit thread( U32 max = -1 );

     virtual ~thread( void );

 

     /**

      * 启动一个线程

      * @return 启动成功否

      */

     bool start( void );

 

     /**

      * 对象上启动的线程数

      * @return 线程数

      */

     U32 count( void );

    

     /**

      * 线程执行函数

      * @return 无

      */

     virtual void run( void ) = 0;

 

     /**

      * 为对象加解锁

      * @return 无

      * @para res 要加解锁的资源对象

      * @para lock 加锁还是解锁

      */

     static void syncLock( void *res,bool lock );

 

private:

     thread( const thread &t );

     thread &operator=( const thread &t );

 

     void *m_datas;

};

    至于实现,我想不难。别忘了,对象销毁时要等待所有线程结束,并释放HANDLE资源哦。否则,线程会访问错误的内存,还有线程HANDLE被泄漏的。(千万别死锁了,自己实现时就因为资源锁来锁去,锁死了。)

    哈哈,就这么简单,一个简单的线程创建、管理就实现了。至于void *,你可以根据自己的实现去定义数据结构。

东西简单,也就不贴出cpp源码了,关键是个想到、做到的问题。

    头文件和lib,放在rar包吧,给大家一个实现后的参考。如果,发现有什么问题,可以随时和我联系。或者,您有更好的想法,并且愿意和我分享,那真是举目明月,尽展抒怀。假如,您对有些语法,比如explicit不明,那么,建议您先看看有关C++的语法或者找您周围的高手,让他们洗脑一番。:}

谢谢阅读,好就此打住。

配套程序下载:http://dev.gameres.com/Program/Other/thread.rar

来源:游戏梦网

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2008/12/28/1940534.html

时间: 2024-09-03 02:59:16

一个简单的线程管理方式。的相关文章

一个简单的线程池

最近自己,很烦所以超级久没学习了,今天趁着抗战七十周年放三天假,赶紧看下书. 废话不多说. 今天,介绍一个简单的线程池. 首先说明什么是线程池,线程池:是包含若干个线程,来处理多个任务的线程集合. 它的目的是用来处理,大量的相对短暂的任务. 这里我们先来解释下两个概念,什么叫大量呢?对于线程来说,需要线程数小于任务数,第二,短暂的任务是指,任务需要相对短暂,如果线程和主进程同周期,则不适合用线程池. 然后来说下CPU数和线程数的关系,如果你的任务主要是计算密集型任务 则:线程个数 = CPU个数

用Python实现一个简单的线程池_python

线程池的概念是什么? 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些 很耗资源的对象创建和销毁.如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因. 我理解为线程池是一个存放很多线程的单位,同时还有一个对应的任务队列.整个执行过程其实就是使

C实现一个简单的线程池

//threadpool.h #ifndef __THREADPOOL_H__ #define __THREADPOOL_H__ #include <pthread.h> typedef void* (*task_fun)(void*); //用链表来维护等待任务 typedef struct threadtask { //任务的执行函数 task_fun task; //执行函数的参数 void* arg; //下一节点 struct threadtask* next; }THREAD_TA

想搞一个简单的交通管理地图演示系统,请有经验的指点一下方向,谢谢

问题描述 功能要求比较简单,用矢量图型和数据库结合显示道路交通标线.交通标志的位置(点击可查看标志图片),地图可以放大缩小,可以在WEB页面添加.修改标志位置等.选取一条路或者一个区域可以统计出标志数量.研究了半天mapxtreme,感觉东西太大,授权也成问题,自己做控件是否可行?有没有更简单的方法实现WEB上这个功能? 解决方案 解决方案二:发错地方了,请管理员删除,谢谢

TkDo (II) 0.2发布 简单的TODO管理

TkDo是一个简单的TODO管理.它不是使用日期,允许您指定每个项目的优先次序. TkDo (II) 0.2此版本字体配置和轻微错误得到修正. 下载地址: Linux binary: tkdo-linux.tar .gz Windows: tkdo-windows.zip Source: tkdo-src.tar.gz

[原创]一个简单的windows HOOK - 隐藏进程管理器中特定的进程

一个简单的windows HOOK - 隐藏进程管理器中特定的进程  (适用平台:windows 2000 sp4,windows XP sp2)           屏蔽任务管理器中的进程名称有很多种方法,可以在ring0级做文章: 修改内核进程链表,拦截内核API等.我这里只给出win32下的实现,原 理是最普通的 windows 钩子机制.实现语言 win32 汇编 (masm32):   0 在DllEntry中处理资源取得和产生"工作"线程: mov eax,_hinstan

深入Java线程管理(一):线程的实现方式

Java的线程实现方式一共有三种,继承Thread.实现Runable接口,实现Callable接口.不过实现Runnable接口与实现Callable接口的方式基本相同,只是Callable接口里定义的方法有返回值,可以声明抛出异常而已. 一. 继承Thread类创建线程类 1) 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务. 2) 创建Thread子类的实例,即创建了线程对象. 3) 调用线程对象的start()方法来启动该线程.

python使用线程封装的一个简单定时器类实例

  本文实例讲述了python使用线程封装的一个简单定时器类.分享给大家供大家参考.具体实现方法如下: ? 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 from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self._fn = N

线程-我想做一个简单的抽签 用windows from 做对txt读写

问题描述 我想做一个简单的抽签 用windows from 做对txt读写 求windows from线程步骤 求windowsfrom 对txt文档读写步骤 非常感谢 解决方案 非常感谢 解决方案二: http://blog.csdn.net/xianfajushi/article/details/7498079