1介绍
许多项目中我们使用到线程。为了在unix和MS_Windows平台下使用一样的代码,我决定在这些平台上将已存在的线程函数封装成一个简单的类。
JThread包是很简单的:当然它仅仅包含三个类:分别被命名为JThread, JMutex 和JMutexAutoLock,从它们的名称上可以想到:JThread表示一个线程JMutex表示一个互斥体,线程类仅仅包含很基本的函数,例如:开始或结束一个线程。
2使用
下面是JThread的描述,JMutex和JMutexAutoLock类。注意函数的返回类型int总是返回0及大于0的值表示成功,负值表示出现了问题。
2.1 JMutex
下面是类JMutex的定义。在你能够使用一个这种类型的实例之前,你首先必须调用Init函数。你通过检测IsInitialized的返回值可以检测到互斥体是否已经初始化。初始化之后,通过调用Lock和Unlock函数可以使互斥体锁定和解锁。
class JMutex
{
public:
JMutex();
~JMutex();
int Init();
int Lock();
int Unlock();
bool IsInitialized();
};
2.1 JMutexAutoLock
下面是JMutexAutoLock的定义。他的目的是更容易实现线程安全函数,不用去担心什么时候为互斥体解锁。
class JMutesAutoLock
{
public:
JMutexAutoLock(JMutex &m);
~JMutexAutoLock();
};
void MyClass::MyFunction()
{
JMutexAutoLock autoLock(m_myMutex);
//在这做互斥保护
}
当autolock变量被创建时,他自动锁定在结构中指定的互斥体m_myMutex。autoLock 变量的析构函数确保lock被释放。
2.3 JThread
为了创建你自己的线程,你不得不从JThread继承一个类,下面是描述。在你的继承类里,你必须实现一个成员函数Thread,这将要在新的线程里执行。在你的自己的线程实现中应当调用ThreadStarted.
为了启动你的线程,你只要简单的调用Start函数。当你自己的Thread函数已经拿户被ThreadStarted调用时,这个函数完成。这是因为,当Start函数完成时,你能确保你自己的Thread能真正的立即运行起来。
你能检测线程是否在运行,可以通过调用IsRunning函数。如果线程已经完成,通过调用GetReturnValue能检测到返回值,最后你能通过kill函数结束它。
你要小心使用kill函数:当线程正在为一个互斥体工作时(例如一个网络互斥体)。当你确信线程被留在一些循环里不能被结束的时候才可以使用Kill函数。
class JThread
{
public:
JThread();
virtual ~JThread();
int Start();
int Kill();
virtual void * Thread() = 0;
bool IsRunning();
void * GetReturnValue();
protected:
void ThreadStarted();