std::tr1::bind 或 std::tr1::function使用

本文探讨了三种线程设计模式:常规面向对象设计、基于闭包的设计及基于接口的设计。通过具体的代码实例,展示了如何利用Boost库和C++标准库中的功能实现这三种模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客网址:http://blog.youkuaiyun.com/kiang3/article/details/7571647


一、常规OO设计:
写一个Thread base class,含有(纯)虚函数 Thread#run(),然后应用程序派生一个继承class,覆写run()。程序里的每一种线程对应一个Thread的派生类。例如Java的Thread可以这么用。
缺点:如果一个class的三个method需要在三个不同的线程中执行,就得写helper class(es)并玩一些OO把戏。


基于closure的设计:
令Thread是一个具体类,其构造函数接受Callable对象。应用程序只需提供一个Callable对象,创建一份Thread实体,调用Thread#start()即可。Java的Thread也可以这么用,传入一个Runnable对象。C#的Thread只支持这一种用法,构造函数的参数是delegate ThreadStart。boost::thread也只支持这种用法。

// 一个基于 closure 的 Thread class 基本结构
class Thread 

public: 
typedef boost::function<void()> ThreadCallback; 
Thread(ThreadCallback cb) : cb_(cb) 
{ } 
void start() 

/* some magic to call run() in new created thread */ 

private: 
void run() 

cb_(); 

ThreadCallback cb_; 
// ... 
}; 


使用:
class Foo
{
public:
void runInThread();
};


Foo foo;
Thread thread(boost::bind(&Foo::runInThread, &foo));
thread.start();

二、基于接口的设计
这个问题来自那个经典的讨论:不会飞的企鹅(Penguin)究竟应不应该继承自鸟(Bird),如果Bird定义了virtual function fly()的话。讨论的结果是,把具体的行为提出来,作为interface,比如Flyable(能飞的),Runnable(能跑的),然后让企鹅实现Runnable,麻雀实现Flyable和Runnable。(其实麻雀只能双脚跳,不能跑,这里不作深究。)进一步的讨论表明,interface的粒度应足够小,或许包含一个method就够了,那么interface实际上退化成了给类型打的标签(tag)。
在这种情况下,完全可以使用boost::function来代替,比如:


// 企鹅能游泳,也能跑
class Penguin
{
public:
void run();
void swim();
};


// 麻雀能飞,也能跑
class Sparrow
{
public:
void fly();
void run();
};


// 以 closure 作为接口
typedef boost::function<void()> FlyCallback;
typedef boost::function<void()> RunCallback;
typedef boost::function<void()> SwimCallback;


// 一个既用到run,也用到fly的客户class
class Foo
{
public:
Foo(FlyCallback flyCb, RunCallback runCb) : flyCb_(flyCb), runCb_(runCb)
{ }
private:
FlyCallback flyCb_;
RunCallback runCb_;
};

// 一个既用到run,也用到swim的客户class
class Bar
{
public:
Bar(SwimCallback swimCb, RunCallback runCb) : swimCb_(swimCb), runCb_(runCb)
{ }
private:
SwimCallback swimCb_;
RunCallback runCb_;
};


int main()
{
Sparrow s;
Penguin p;
// 装配起来,Foo要麻雀,Bar要企鹅。
Foo foo(bind(&Sparrow::fly, &s), bind(&Sparrow::run, &s));
Bar bar(bind(&Penguin::swim, &p), bind(&Penguin::run, &p));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值