c++ - boostnamed_mutex私有(private)成员访问错误

标签 c++ boost mutex private interprocess

我遇到的问题是,我需要为类中的托管共享内存成员使用命名互斥体,并收到“无法访问类 boost::interprocess::named_mutex 中声明的私有(private)成员”错误。然而,我都从 boost::noncpoyable 派生了我的类,并在构造函数中使用了带有 move-semantic 的 std::unique_ptr ,但没有成功。使用boost 1_60和VS 2010,代码如下:

class FileLocker : private boost::noncopyable
{
public:
    FileLocker();
    ~FileLocker();

private:
    boost::interprocess::managed_shared_memory m_oShMem;
    std::unique_ptr<boost::interprocess::named_mutex> m_oSetFileMutex;  
};

cpp 文件:

FileLocker::FileLocker()
{
  m_oShMem = managed_shared_memory(open_or_create, m_oMemName.c_str(), 1024);
  m_oSetFileMutex = make_unique<named_mutex>( m_oShMem.find_or_construct<named_mutex>("viVideoFileInOutMutex")() );
}

最后是使唯一:

template<typename T>
std::unique_ptr<T> make_unique()
{
    return std::unique_ptr<T>( new T() );
}

template<typename T, typename Ts>
std::unique_ptr<T> make_unique(Ts&& params)
{
    return std::unique_ptr<T>( new T(std::forward<Ts>(params)) );
}

我读了几个关于这个问题的 Stackoverflow-Threads,但它们都指出了我已经处理过的不可复制性......

感谢您的帮助!

最佳答案

抛开其他问题不谈,您在两个地方错误地调用了 named_mutex 构造函数。

其中之一在这里:

m_oShMem.find_or_construct<named_mutex>("viVideoFileInOutMutex")()

您传递的字符串参数是共享内存中对象的名称,但它不会传递给实际对象的构造函数,在本例中为named_mutex。所以这基本上会导致调用named_mutex的默认构造函数,它是私有(private)的。要将参数传递给底层对象的构造函数,您必须像这样发送它们:

m_oShMem.find_or_construct<named_mutex>("viVideoFileInOutMutex")(open_or_create, "named_mutex_name")

在第二组括号中。

第二个问题在同一行开始:

m_oSetFileMutex = make_unique<named_mutex>( m_oShMem.find_or_construct<named_mutex>("viVideoFileInOutMutex")(open_or_create, "named_mutex_name") );

这基本上等同于:

named_mutex *temp = m_oShMem.find_or_construct<named_mutex>("viVideoFileInOutMutex")(open_or_create, "named_mutex_name") );
m_oSetFileMutex = make_unique<named_mutex>(temp);

您已经有一个指向 named_mutex 的原始指针,并将其传递给 make_unique。这导致 make_unique 调用 named_mutex 的构造函数,将 named_mutex* 作为参数。这样的构造函数不存在。

关于c++ - boostnamed_mutex私有(private)成员访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35796156/

相关文章:

c++ - 为什么我得到 "No manual entry for gcc"

c++ - 如何修复重叠的 XML?

c++ - 如何从 boost::posix_time::ptime 获取自纪元时间以来的毫秒数

c++ - boost::mpi 的 irecv() 返回未初始化的状态对象

c++ - 重新哈希时锁定 HashMap

c++ - 基于以下场景同步两个线程的最佳方法?

c++ - 什么是流行的、多平台的、免费的、开源的套接字库

c# - 一个解决方案中的非托管 DLL 项目和托管 WinForms 应用程序

java - 将代码从 java 转换为 c++ 的 mysql 连接器错误

go - 我应该使用 channel 还是 sync.Mutex lock()?