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是用来实现多线程编程的,这个绝大 ...
随机推荐
- 简单几何(直线与圆的交点) ZOJ Collision 3728
题目传送门 题意:有两个一大一小的同心圆,圆心在原点,大圆外有一小圆,其圆心有一个速度(vx, vy),如果碰到了小圆会反弹,问该圆在大圆内运动的时间 分析:将圆外的小圆看成一个点,判断该直线与同心圆 ...
- BZOJ4289 : PA2012 Tax
一个直观的想法是把每条边拆成两条有向边,同时每条有向边是新图中的一个点.对于两条边a->b与b->c,两点之间连有向边,费用为两条边费用的最大值.然后新建源点S与汇点T,由S向所有起点为1 ...
- BZOJ3832 : [Poi2014]Rally
f[0][i]为i出发的最长路,f[1][i]为到i的最长路 新建源汇S,T,S向每个点连边,每个点向T连边 将所有点划分为两个集合S与T,一开始S中只有S,其它点都在T中 用一棵线段树维护所有连接属 ...
- MONO 说谈
Xamarin android现在到底依赖Dalvik不?是部分依赖的 驱动 编译后的IL经过CLR并不能直接成为机器码,而是要借助Dalvik才能成为机器码吗? 而是关于Android的驱动部分主 ...
- Codeforces Round #199 (Div. 2) A Xenia and Divisors
注意题目的数字最大是7 而能整除的只有 1,2,3,4,6,故构成的组合只能是1,2,4 或1,2,6或1,3,6,故分别统计1,2,3,4,6的个数,然后再分配 #include <iostr ...
- TYVJ P1002 谁拿了最多奖学金 Label:模拟 水
背景 NOIP2005复赛提高组第一题 描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同:1) 院士奖学金,每人8000元,期末平均成绩高于80分( ...
- 【SPOJ】694. Distinct Substrings
http://www.spoj.com/problems/DISUBSTR/ 题意:求字符串不同子串的数目. #include <bits/stdc++.h> using namespac ...
- MLUtils.loadLibSVMFile
import org.apache.spark.mllib.util.MLUtils// Load and parse the data file. val data = MLUtils.loadLi ...
- hdu 饭卡
本题的思路是:首先如果m<5,直接输出:若m>5,则先拿出5元钱买最贵的东西,这样背包容量就变成了m-5,商品数量为n-1的0/1背包问题. 此题的状态转移方程为:dp[j]=max{dp ...
- OpenSSL使用方法
生成CA (勾选Generate Self Signed Certificate)openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout & ...