【Poco笔记】线程Thread
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【Poco笔记】线程Thread相关的知识,希望对你有一定的参考价值。
参考技术A 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,有些实现直接借助于它。
poco普通线程
#include "Poco/Thread.h" #include "Poco/RunnableAdapter.h" #include <iostream> class Greeter { public: void greet() { std::cout << "Hello, world!" << std::endl; } }; int main(int argc, char** argv) { Greeter greeter; Poco::RunnableAdapter<Greeter> runnable(greeter, &Greeter::greet); Poco::Thread thread; thread.start(runnable); thread.join();//等待该线程技术 return 0; }
以上是关于【Poco笔记】线程Thread的主要内容,如果未能解决你的问题,请参考以下文章