C++ 线程类的一个实现
.h
#ifndef CTHREAD_H_
#define CTHREAD_H_
#include "plat.h" class CThread
{
public:
enum
{
enmThreadTerminateTimeout = ,
};
CThread();
virtual ~CThread();
int32_t Start();
virtual int32_t Terminate();
virtual void Execute();
protected:
#ifdef OS_WIN32
uint32_t m_nTimeOut;
HANDLE m_hThread;
#else
pthread_t m_thread;
pthread_mutex_t m_stMutex;
#endif
bool m_bTerminated;
}; #endif
.cpp
#include "thread.h"
#include "common_api.h"
#ifdef OS_WIN32
void ThreadProc(void *pParam)
{
if (NULL == pParam)
{
return;
}
CThread *p = (CThread*)pParam;
p->Execute();
}
#else
void* ThreadProc(void* pParam)
{
if (NULL == pParam)
{
return NULL;
}
CThread *p = (CThread*)pParam;
p->Execute();
return NULL;
}
#endif CThread::CThread()
{
#ifdef OS_WIN32
m_nTimeOut = enmThreadTerminateTimeout;
m_hThread = INVALID_HANDLE_VALUE;
#else
m_thread = ;
#endif
m_bTerminated = false;
} CThread::~CThread()
{
Terminate();
} int32_t CThread::Start()
{
m_bTerminated = false;
#ifdef OS_WIN32
m_hThread = (HANDLE)_beginthread(ThreadProc, , this);
#else
pthread_create(&m_thread, NULL, ThreadProc, this);
#endif
return ;
} int32_t CThread::Terminate()
{
if (m_bTerminated == true)
{
return ;
}
m_bTerminated = true;
#ifdef OS_WIN32
if (m_hThread != INVALID_HANDLE_VALUE)
{
// wait for (m_nTimeOut) milliseconds or Excute() return
WaitForSingleObject(m_hThread, m_nTimeOut);
}
#else
if (m_thread != )
{
// wait Excute() return
pthread_join(m_thread, NULL);
}
#endif
return ;
} void CThread::Execute()
{
uint32_t n = ;
while (!m_bTerminated)
{
if ((++n) % == )
{
printf("%d\n", n);
}
Delay();
}
#ifdef WIN32
_endthread();
#else
pthread_exit(NULL);
#endif
}
C++ 线程类的一个实现的更多相关文章
- 【C/C++开发】C++实现简单的线程类
C++封装一个简单的线程类 多线程编程简介: 大家在编程时,经常需要在程序中启动一个或多个线程来处理任务,而如果每次都是去调用系统创建线程的API函数来创建,代码量虽不多,但线程的创建和业务逻辑代码就 ...
- 【Java】学习路径49-练习:使用两个不同的线程类实现买票系统
练习:使用两个不同的线程类实现买票系统 请创建两个不同的线程类.一个测试类以及一个票的管理类. 其中票的管理类用于储存票的数量.两个线程类看作不同的买票方式. 步骤: 1.创建所需的类 App售票线程 ...
- 转:一个跨WINDOWS LINUX平台的线程类
来源:http://blog.csdn.net/dengxu11/article/details/7232681 继Windows下实现一个CThread封装类之后,这里我再实现一个跨WINDOWS ...
- 从零开始构建一个Reactor模式的网络库(二)线程类Thread
线程类Thread是对POSIX线程的封装类,因为要构建的是一个Linux环境下的多线程网络库,对线程的封装是很必要的. 首先是CurrentThread命名空间,主要是获取以及缓存线程id: #if ...
- 转:学习笔记: Delphi之线程类TThread
学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...
- 学习笔记: Delphi之线程类TThread
新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...
- java: Thread 和 runnable线程类
java: Thread 和 runnable线程类 Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有ru ...
- Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……
接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...
- Delphi中线程类TThread实现多线程编程1---构造、析构……
参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...
随机推荐
- Jquery操作
一.文档操作 1.内部插入:append(),appendTo(),prepend(): 2.外部插入:after(),before(): 3.删除操作:remove(),empty(): 4.克隆操 ...
- BZOJ3836 : [Poi2014]Tourism
对于一个连通块,取一个点进行dfs,得到一棵dfs搜索树,则这棵树的深度不超过10,且所有额外边都是前向边. 对于每个点x,设S为三进制状态,S第i位表示根到x路径上深度为i的点的状态: 0:选了 1 ...
- 有关g++编译调试的问题
打了个指针版的treap,想用gdb调试,用gcc -g ×××.cpp -o a 时却报错了——直接用gcc编译却不会报错,提示:对‘operator new(unsigned int)’未定义的引 ...
- JavaScript事件流
什么是JS事件流 早期的IE事件传播方向为由上至下,即从document逐级向下传播到目标元素:而Netscape公司的Netscape Navigator则是朝相反的方向传播, 也就是从目标元素开始 ...
- Robotium查找指定控件
一.通过ID查找控件 Activity act=solo.getCurrentActivity(): int id=act.getResources().getIdentifier("id名 ...
- BST & Treap
二叉查找树递归定义: 二叉查找树是空树或不是空树二叉查找树的左二叉查找树的值一定小于二叉查找树的值或左二叉查找树为空树二叉查找树的右二叉查找树的值一定大于二叉查找树的值或右二叉查找树为空树 不维护父亲 ...
- Android使用AsyncTask实现可以断点续传的DownloadManager功能
http://www.it165.net/pro/html/201211/4210.html 最近做项目卡壳了,要做个Android的应用市场,其他方面都还好说,唯独这个下载管理算是给我难住了,究其原 ...
- centos 下如何加入sudo 用户
当在终端执行sudo命令时,系统提示“ jackluo is not in the sudoers file”: $ sudo ls Password:jackluo is not in the su ...
- poi读写word模板 / java生成word文档
有一word文档表格 形如: 姓名 ${name} 电话 ${tel} 从数据库读取记录替换上述变量 import java.io.FileOutputStream; import java.util ...
- oracle 存储过程 基础
差不多一年没写过存储过程,最近要写,发现基本忘了,google一番之后,觉得很有必要把基础的东西写下来备忘. 语句块定义: decalre -- 变量声明 var1 ); -- 仅声明 var2 ) ...