在c ++ 11和c ++ 03中监视<t>类实现?</t>

时间:2013-03-15 14:46:45

标签: c++ boost c++11 synchronization

Herb Sutter描述了“C ++和2012之后:Herb Sutter - C ++ Concurrency”中模板Monitor类的实现:

template<class T> class monitor {
private:
     mutable T t;
     mutable std::mutex m;
public:
     monitor( T t_ ) : t( t_ ) { }

     template<typename F>
     auto operator()( F f ) const -> decltype(f(t))
     {  std::lock_guard<mutex> hold{m};  return f(t);  }
};

我正在尝试包装现有的Logger类:

Logger logger;
monitor< Logger > synchronizedLogger( logger ) ;

我有两个问题。 为什么此代码不能在带有c ++ 11的Visual Studio 2012中编译? 编译器说“'Debug':不是'monitor'的成员”,其中Debug是Logger类的一种方法。

如何使用Boost库使用C ++ 03编译器实现相同的监视器模板类。

2 个答案:

答案 0 :(得分:8)

您可能会尝试执行monitor< Logger >::Debug(...)调用之类的操作。这不行。

您的显示器可以调用功能 尝试:

monitor< Logger > logger;
logger(boost::bind(&Logger::Debug, _1, "blah"));

PS:我没有使用过C ++ 11 lambdas,没有犯错误我提供了boost :: bind version

编辑:Dave提供了该版本

logger([](Logger& l){ l.Debug("blah"); });

答案 1 :(得分:0)

谢谢大家的回答和评论。 有我的监视器实现&lt; T>在你的帮助之后使用C ++ 03和Boost库。

#include <boost/bind.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/locks.hpp>
#include <boost/utility/result_of.hpp>

template<class T> class monitor
{
private:
     mutable T& t;
     mutable boost::mutex m;
public:
     monitor( T& t_ ) : t( t_ )
     {
     }

     template< typename F >
     typename boost::result_of< F() >::type operator()( F f ) const
     {
          boost::lock_guard< boost::mutex > hold( m );
          return f( t );
     }
};

谈论这个解决方案的正确性(粗粒度的锁等)我正在考虑使用这个类作为单元测试中我的ILogger接口的Google Mock实现的包装器。 Google模拟文档声明它在Windows上不是线程安全的。

 ILogger * mockedLogger = new MockedLogger();
 monitor< ILogger > synchronizedLogger( *mockedLogger ) ;
 synchronizedLogger( boost::bind( &ILogger::Debug, _1, "blah" ) );