5

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' : is not a member of 'monitor'”,其中 Debug 是 Logger 类的方法。

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

4

2 回答 2

8

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

您的显示器可以调用函数尝试:

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

PS:我没用过C++11 lambdas,为了不犯错我提供了boost::bind版本

编辑:戴夫好心地提供了那个版本

logger([](Logger& l){ l.Debug("blah"); });
于 2013-03-15T14:54:45.247 回答
0

谢谢大家的回答和评论。在您的帮助下,我使用 C++03 和 Boost 库实现了监视器<T>。

#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 实现的包装器。谷歌模拟文档指出它在 Windows 上不是线程安全的。

 ILogger * mockedLogger = new MockedLogger();
 monitor< ILogger > synchronizedLogger( *mockedLogger ) ;
 synchronizedLogger( boost::bind( &ILogger::Debug, _1, "blah" ) );
于 2013-03-19T08:37:28.557 回答