【Poco笔记】线程Thread

如题所述

第1个回答  2022-07-04

Poco的Thread是对标准库std::thread的封装,同时它类似Java一样,提供了Runnable接口。所以使用上是对标Java的。
与标准库不同的是,Poco::Thread创建和运行时相分离的。这一点标准库设计确实不太友好。例如下面例子。

同样看例子

由上面可见,使用基本跟Java类似。创建与运行也分离了。

看一下主要的运行接口,摘自Poco1.9源码

源码文件主要包含
1.Thread.h/Thread.cpp
提供外部调用接口
在Thread.cpp中定义了两种Holder, RunnableHolder和CallableHolder。Holder技术是Poco框架中经常用到的,是对某一种类型对象的指针包装。
Runnable为线程运行类的基类,
Callable为带一个参数的方法

2.Thread_POSIX.h/Thread_POSIX.cpp
3.Thread_VX.h/Thread_VX.cpp
4.Thread_WIN32.h/Thread_WIN32.cpp
5.Thread_WINCE.h/Thread_WINCE.cpp
这几个文件,每个文件中都定义了ThreadImpl,用于不同平台下的具体实现,Thread私有继承ThreadImp,ThreadImp用于哪一个文件由编译宏决定。

顺便说一下POSIX系统下的实现。因为使用的是c++98,当时没有thread类,所以所有的实现都是使用pthread库来实现的。具体的使用请参考pthread技术文档。

6.ThreadLocal.h/ThreadLocal.cpp
ThreadLocal中定义了三个类, TLSAbstractSlot类, TLSSlot类, ThreadLocalStorage类

TLSAbstractSlot是基类,TLSSlot是模板类,通过模板技术包裹了具体的类型。ThreadLocalStorage是用于线程存储,具体是通过一个map来实现。
因为1.9使用的是c++98,还没有引用local_thread关键字,所以这里是通过这种方式实现。

ThreadLocalStorage定义如下

那么Poco::Thread的tls是如何定义的?

源码文件比较少,主要如下文件
1.Thread.h/Thread.cpp

2.Thread_STD.h/Thread_POSIX.cpp/Thread_VX.cpp/Thread_WIN32.cpp

Thread.h 主要对实现类ThreadImp的包装,并定义了对外接口。
Thread_STD.h定义了内部实现,主要提供了 ThreadImp
Thread_POSIX.cpp/Thread_VX.cpp/Thread_WIN32.cpp分别定义不同平台下的兼容实现

在Thread_STD.h中定义了几个重要类型

在Thread.cpp中增加了两种

private修饰的ThreadData,定义了线程内部数据。 1.9中源码分别定义在各个平台实现类中,这里抽离出来定义在Thread.cpp中。较之前的定义,这里额外的是新增了std::thread指针。因为直接引用了c++11中的thread,有些实现直接借助于它。