MyException - 我的异常网
当前位置:我的异常网» C++ » 奇技淫巧C++之方法代理,该如何解决

奇技淫巧C++之方法代理,该如何解决

www.MyException.Cn  网友分享于:2015-08-26  浏览:53次
奇技淫巧C++之方法代理
自我感觉很有趣的技术,共享^_^
http://blog.csdn.net/wingfiring/archive/2007/03/28/1543811.aspx

如果你有编写多线程程序的经历,遇到过需要共享对象的情况吗?比如,你想在两个线程中操作同一个容器,你会怎么做呢?是在每个地方都小心翼翼地加锁,还是封装一个来用?两种方法我都用过,但我比较青睐封装一个的办法,例如,封装一个带锁的队列,用于线程间的通信.
  让我们先看看直接操作锁和对象的代码:
//declare:
std::Container   cont;
LockType   contLock;
...
//using:
contLock.lock();
cont.XXX();
contLock.unlock();
  嗯,using下面的加锁和解锁的方法太老土,而且最关键的,还不安全,让我们稍加改善:
ScopedLock   guard(contLock);     //在ScopedLock的构造函数中lock,在析构函数中unlock
cont.XXX();
        看上去稍好了一点,然而有两个小的缺点。前面提到共享对象,第一个缺点就是我们需要共享两个对象,容器和锁,这使得管理和传递共享对象都变得麻烦起来。另一个缺点是,加锁的动作需要小心谨慎,千万别忘了。可惜,即使忘了,我们也不会从编译器这里得到任何帮助。这两个不便,都会促使我们考虑是不是把对象和锁封装起来更好?很多时候,我们确实是这么做的,看一个deque的例子(省略std).
template <typename   T,   typename   Alloc=   allocator <T>   >
class   shared_deque{
        dequeT,   Alloc>   m_cont;
        LockType       m_lock;
        ...
        void   push_back(const_reference   val){
              ScopedLock   guard(m_lock);
              m_cont.push_back(val);
        }
        ....
};
        呼,终于好了,我们现在有了一个好用的shared_queue了。只是,类似那个push_back的东西,重复了几十遍,很无聊的,还有必要对   list也来一遍吗?算了吧!万幸,没有用basic_string,那家伙可有100多个成员函数。有没有办法简化一下工作呢?重复的东西总是应该交给计算机来做是不是?还好,C++正好能帮助我们实现这一目标,这个手法在MCD中被寥寥数语带过,就是那神奇的operator-> ().
      让我们回顾一下operator-> 的用法:用于对象指针,提取对象成员,函数或对象.许多smart   pointer地实现都重载了这个运算符,从而可以模拟指针的语法.一般的重载形式是这样的:
cv1   T*   operator-> ()   cv2
      这里返回的是T*类型,如果返回的不是指针类型呢?C++标准对此有特别规定,会继续调用返回值的operator-> ()方法,直到最终解析出一个指针类型.假定有下面的operator-> 展开过程:
object   a--> b--> T   pointer
(请注意一下a,b,T对象的生命期,确定我们是安全地在使用这些对象.)a对象的operator-> 返回临时对象b,b对象的operator   -> 返回最终类型T*.那么,b对象必须在其T*   operator-> ()调用之前创建好,而在T::XXX()方法调用之后被销毁,因为b是临时对象.嗯,好了,有点方向了:在b的构造函数中加锁,在析构中解锁,就可以在调用T::XXX()方法时自动实现加锁可解锁了.
  拓展一下思维,我们必须局限于锁和容器吗?不必.这个手法的本质效果是什么?就是在调用一个方法之前,插入一些操作,调用之后再插入一些操作(稍显遗憾的是,我们无法知道被调用的到底是什么方法).但是,这也够我们做许多事情了.实现如下:
#include
        template
        <
                typename   Pointer,
                typename   Monitor,
                typename   ScopedType   =   typename   Monitor::scope_type
        >
        class   call_proxy
        {
        public:
                typedef   call_proxy   self_type;
                typedef   Pointer   pointer_type;
                typedef   Monitor   monitor_type;
                typedef   ScopedType   scoped_type;

                typedef   typename   boost::call_traits <pointer_type> ::param_type   param_type;              
                typedef   monitor_type&   monitor_reference;

        private:              

文章评论

 程序员的样子
程序员的样子
每天工作4小时的程序员
每天工作4小时的程序员
一个程序员的时间管理
一个程序员的时间管理
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
Java程序员必看电影
Java程序员必看电影
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员都该阅读的书
程序员都该阅读的书
我是如何打败拖延症的
我是如何打败拖延症的
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
老程序员的下场
老程序员的下场
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员应该关注的一些事儿
程序员应该关注的一些事儿
我的丈夫是个程序员
我的丈夫是个程序员
代码女神横空出世
代码女神横空出世
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
编程语言是女人
编程语言是女人
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员的鄙视链
程序员的鄙视链
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
鲜为人知的编程真相
鲜为人知的编程真相
为什么程序员都是夜猫子
为什么程序员都是夜猫子
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员必看的十大电影
程序员必看的十大电影
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
如何成为一名黑客
如何成为一名黑客
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
中美印日四国程序员比较
中美印日四国程序员比较
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员和编码员之间的区别
程序员和编码员之间的区别
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有