【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的主要内容,如果未能解决你的问题,请参考以下文章

Java 多线程笔记

c++11 thread学习笔记

c++11 thread学习笔记

Java高并发学习笔记:Thread详解

Java 基础知识点 笔记总结

JAVA学习笔记线程的生命周期及Thread类常用方法