Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在两个对象之间共享容器的提示?_C++_Stl - Fatal编程技术网

C++ 在两个对象之间共享容器的提示?

C++ 在两个对象之间共享容器的提示?,c++,stl,C++,Stl,我有一些STL容器需要在两种不同类型的对象之间共享,比如A和B。该容器在类A中定义,在类B中用作引用。由于STL容器不是线程安全的,所以我计划在A中定义boost::mutex,并将其作为引用存储在类B中 这个计划显然失败了,因为我意识到,boost::mutex是不可复制的。我无法将容器移出类A或在容器上提供包装。你会在这里做什么 为什么不能复制互斥体 我不是100%确定我能做到,但是如果您想在一个类的两个实例之间共享互斥来保护共享资源,为什么不使用boost::shared_ptr从两个实例

我有一些STL容器需要在两种不同类型的对象之间共享,比如A和B。该容器在类A中定义,在类B中用作引用。由于STL容器不是线程安全的,所以我计划在A中定义
boost::mutex
,并将其作为引用存储在类B中

这个计划显然失败了,因为我意识到,
boost::mutex
是不可复制的。我无法将容器移出类A或在容器上提供包装。你会在这里做什么


为什么不能复制互斥体

我不是100%确定我能做到,但是如果您想在一个类的两个实例之间共享互斥来保护共享资源,为什么不使用
boost::shared_ptr
从两个实例访问互斥呢

这应该是一个通用的策略,当你需要共享资源时,你也可以考虑使用“代码>Boo::SaldDypTr>/Copy>容器本身,但是没有看到你的代码,很难提供一些具体的建议。”

class Sample
{
  std::vector<int> v;
private:
  struct Mut;
};

struct Sample::Mut
{
  boost::mutex mut_;
};
类noncopyable是基类。从中派生您自己的类 如果要禁止复制构造和复制,则不可复制 任务

实际上,您不需要它们的副本,因为它是无用的,但是您希望在许多对象中共享同一个实例,并引用单个互斥体来保护对单个资源的访问

//  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;

我们讨论的是共享同一容器的两种不同类类型的对象。一个在内部定义了它,另一个保留了一个引用。@Fantatic23我理解,但我不认为你理解我的建议?在
A
中初始化
shared\u ptr
,并将
shared\u ptr
复制到
B
。共享指针是可复制的,您可以从这两个类访问存储的互斥体。如果您不清楚这一点,我认为您在wrt资源处理方面有一个更基本的问题。
a
B
是否总是在不同的线程上工作?创建拥有容器并提供a和B所需的线程安全操作的C类。您认为复制互斥锁的效果应该是什么?如果有人锁定其中一个而不是另一个会发生什么?复制构造函数通常与“值语义”的概念相关联。也就是说,复制后,您有两个比较相等的独立对象。这对于资源管理(RAII)类型是不可能的(要么两个副本不是独立的,要么它们的比较不相等)。事实上,甚至没有为
boost::mutex
定义比较,可能是因为唯一合理的定义是身份(
a
等于
b
IFF
a
is
b
)。DyP,不,这比值语义或RAII更与概念本身相关。
noncopyable
的实现无法解释为什么互斥被故意设置为不可复制。@DyP你可以这样问,这里只强调复制构造函数和复制赋值成员是私有的,我总是喜欢展示一些真实的代码,而不是仅仅猜测(或仔细考虑理论)。在这里你可以看到,互斥体的构造函数确实是私有的。我之所以写这篇评论是因为我将OP的问题“为什么互斥体不能被复制?”解释为“为什么互斥体被设置为不可复制的?”而不是“互斥体是如何被设置为不可复制的?”这解释了一切,因为不可复制的定义回答了第一个问题,而不是第二个问题,这是你们的解释
#include <boost/thread/mutex.hpp>

class mutex:
    boost::noncopyable
{
//  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;