class Sample
{
std::vector<int> v;
private:
struct Mut;
};
struct Sample::Mut
{
boost::mutex mut_;
};
或者
class Sample {
std::vector<int> v;
public:
boost::shared_ptr<boost::mutex> mutt;
Sample() : mutt(new boost::mutex) {}
};
boost::mutex
现在您可以在其他提供对互斥体包装器的访问的对象中引用此示例的 ,或者可以直接使用Mut
结构或boost::shared_ptr
. boost::shared_ptr
是可复制的,它的所有副本都将共享给定的互斥锁。
为什么不能复制互斥锁?
因为 mutex 是不可复制的。这是它源自boost::noncopyable
:
#include <boost/thread/mutex.hpp>
class mutex:
boost::noncopyable
{
类 noncopyable 是一个基类。当您想禁止复制构造和复制分配时,从 noncopyable 派生您自己的类。
实际上,您不需要它们的副本,因为它没有用,而是您希望在许多对象中共享相同的实例并引用一个保护对单个资源的访问的互斥锁。
来自<boost/noncopyable.hpp>
:
// Private copy constructor and copy assignment ensure classes derived from
// class noncopyable cannot be copied.
// Contributed by Dave Abrahams
namespace noncopyable_ // protection from unintended ADL
{
class noncopyable
{
protected:
#ifndef BOOST_NO_DEFAULTED_FUNCTIONS
BOOST_CONSTEXPR noncopyable() = default;
~noncopyable() = default;
#else
noncopyable() {}
~noncopyable() {}
#endif
#ifndef BOOST_NO_DELETED_FUNCTIONS
noncopyable( const noncopyable& ) = delete;
noncopyable& operator=( const noncopyable& ) = delete;
#else
private: // emphasize the following members are private
noncopyable( const noncopyable& );
noncopyable& operator=( const noncopyable& );
#endif
};
}
typedef noncopyable_::noncopyable noncopyable;