本文主要整理了网上见到的,以及自己编写的有关隘poco的例子,本着开源共享的精神,供大家参考,加快poco框架库的学习和使用,加快自己在项目上的应用,加速产品的设计与开发.
例子一: 传入对象
在Poco中,将入口函数抽象为一个类Runnable,该类提供void run()接口,用户需要继承至该类来实现自定义的入口函数。Poco将线程也抽象为一个类Thread,提供了start, join等方法,如下:
定义一个Thread对象,调用其start方法并传入一个Runnable对象来启动线程,使用的方法比较简单
#include "Poco/Thread.h"#include "Poco/Runnable.h"#includeclass HelloRunnable: public Poco::Runnable{ virtual void run() { std::cout << "Hello, world!" << std::endl; }};int main(int argc, char** argv){ HelloRunnable runnable; Poco::Thread thread; thread.start(runnable);//传入对象而不是对象指针 thread.join();}
例子二:传入一个定义好的类中的函数
如果你的线程的入口函数在另一个已定义好的类中,那么Poco提供了一个适配器来使线程能够从你指定的入口启动,并且无需修改已有的类:
#include "Poco/Thread.h"#include "Poco/RunnableAdapter.h"#includeclass Greeter{public: void greet() { std::cout << "Hello, world!" << std::endl; }};int main(int argc, char** argv){ Greeter greeter; Poco::RunnableAdapter runnable(greeter, &Greeter::greet); Poco::Thread thread; thread.start(runnable); thread.join();//等待该线程技术 return 0;}
例子三:直接传入函数和参数
Thread::start除了接收Runnable对象之外,还可以传入函数和参数
#include#include "Poco/Thread.h"#include "Poco/ThreadLocal.h"#include "Poco/Runnable.h" using namespace std; using namespace Poco;void sayHello(void* name){ cout<<"Hello "<<(char*)name<
例子四:线程局部变量存储
ThreadLocal类为开发者提供了更为简洁的TLS机制使用方法,TLS机制用来保存这样一些变量:它们在不同的线程里有不同的值,并且各自维护,线程不能访问其他线程中的这些变量。
在一个线程修改的内存内容,对所有线程都生效。这是一个优点也是一个缺点。说它是优点,线程的数据交换变得非常快捷。说它是缺点,一个线程死掉了,其它线程也性命不保; 多个线程访问共享数据,需要昂贵的同步开销,也容易造成同步相关的BUG。
如果需要在一个内部的各个都能访问、但其它线程不能访问的(被称为static memory local to a thread 线程局部),就需要新的机制来实现。这就是。
#include "Poco/Thread.h"#include "Poco/Runnable.h"#include "Poco/ThreadLocal.h"#includeclass Counter: public Poco::Runnable{ void run() { static Poco::ThreadLocal tls; for (*tls = 0; *tls < 10; ++(*tls)) { std::cout << *tls << std::endl; } }};int main(int argc, char** argv){ Counter counter; Poco::Thread t1; Poco::Thread t2; t1.start(counter); t2.start(counter); t1.join(); t2.join(); return 0;}
例子五:综合性例子
#include#include "Poco/Thread.h"#include "Poco/Runnable.h"#include "Poco/ThreadTarget.h"#include "Poco/RunnableAdapter.h"using namespace std ;using Poco::Thread;using Poco::Runnable;using Poco::ThreadTarget;using Poco::RunnableAdapter;//传入对象class MyRunnable:public Runnable{public: void run() { std::cout << "hello MyRunnable." << std::endl; }};//传入函数void gFun4Td(){ std::cout << "hello gFun4Td" << std::endl;}//直接传入类中的函数class staticFun4Td{public: static void staticFun() { std::cout << "hello static fun." << std::endl; }};class commFun4Td{public: void commFun() { std::cout << "hello common function." << std::endl; }};int main(){ Thread t1("MyRun"); Thread t2("global"); Thread t3("static"); Thread t4("comm"); MyRunnable rMy; ThreadTarget rg(gFun4Td); ThreadTarget rs(&staticFun4Td::staticFun); commFun4Td com; RunnableAdapter rc(com,&commFun4Td::commFun); t1.start(rMy); Thread::sleep(100); t2.start(rg); Thread::sleep(100); t3.start(rs); Thread::sleep(100); t4.start(rc); t1.join(); t2.join(); t3.join(); t4.join(); return 0;}