监视 c<T>++11 和 c++03 中的类实现?

Monitor<T> class implementation in c++11 and c++03?

本文关键字:实现 c++03 ++11 lt gt 监视      更新时间:2023-10-16

Herb Sutter在" c++ and Beyond 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 ) ;
我有两个问题。为什么这个代码不编译在Visual Studio 2012与c++11?编译器说" 'Debug':不是'monitor'的成员",其中Debug是Logger类的一个方法。

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

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

您的监视器可以调用函数试一试:

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

PS: 我没有使用c++ 11的lambdas,为了不出错,我提供了boost::bind version

edit: Dave好心提供了那个版本

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

感谢大家的回答和评论。这是我实现的monitor

#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 mock文档指出它在windows上不是线程安全的。

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