这一部分主要包括了Thread、ThreadImpl类,封装了线程操作并提供了命名线程功能。
一、基本概况
隶属模块: Foundation
Thread是线程接口类,其主要功能是由ThreadImpl来实现的。根据不同的平台,实现相应平台的线程操作。
class Thread : private ThreadImpl
{
// …
};
因为Thread的主要功能实现来自于ThreadImpl,因此Thread内部的功能函数大部分都是类似于下面的风格:
void Thread::start(Runnable& target)
{
startImpl(target);
}
即将Thread类成员的调用传递给ThreadImpl类相应功能的成员。这样的好处是在其接口不变的情况下实现可以随意变化。这里的变化主要来自于不同的平台。
这个封装最核心的部分应该是start()函数了,此函数用来启动一个线程。Thread类使用重载的方法定义了两个start()函数。
void startImpl(Runnable& target);
void startImpl(Callable target, void* pData = 0);
void Thread::start(Runnable& target)
{
startImpl(target);
}
二、 Thread和ThreadImpl类的数据成员
Thread
// 线程ID,不是pthread_t类型,只是作为Thread线程唯一标识。
int _id;
// 线程名称。
std::string _name;
// 此对象为每个线程管理一些数据
ThreadLocalStorage* _pTLS;
// 实现线程互斥锁
mutable FastMutex _mutex;
ThreadImpl
// 用来存储线程数据
AutoPtr<ThreadData> _pData;
// 静态变量,用来存储当前线程对象。
static CurrentThreadHolder _currentThreadHolder;
为了了解上面出现的相关类变量类型的实现,这里也将代码贴上看着方便:
下面两个类是作为ThreadImpl的内部类定义的。
class CurrentThreadHolder
{
public:
CurrentThreadHolder()
{
if (pthread_key_create(&_key, NULL))
throw SystemException("cannot alloc