我有一些STL容器,我需要在两种不同类型的对象之间共享 - 比如A& B.容器在A类中定义,并在B类中用作参考。由于STL容器不是线程安全的,我计划在A中定义boost::mutex
并将其作为参考存储在B类中。
该计划显然已失败,因为我发现boost::mutex
不可复制。我无法将容器移出A类或在容器上提供包装。你会在这做什么?
为什么不能复制互斥锁?
答案 0 :(得分:2)
我不是100%确定我可以关注,但是如果你想在一个类的两个实例之间共享一个互斥锁以保护共享资源,那么为什么不使用boost::shared_ptr<boost::mutex>
来访问来自的互斥锁两个实例?
当您需要共享资源时,这应该是一般策略,您也可以考虑将boost::shared_ptr
用于容器本身,但是如果没有看到您的代码,则很难提供一些具体的建议。
答案 1 :(得分:0)
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
可复制,其所有副本将共享给定的互斥锁。
为什么不能复制互斥锁?
因为互斥锁是不可复制的。这是源自boost::noncopyable
:
#include <boost/thread/mutex.hpp>
class mutex:
boost::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;