【问题标题】:boost mutex strange error with private member使用私人成员提升互斥锁奇怪错误
【发布时间】:2012-02-14 21:22:04
【问题描述】:

我有一个奇怪的错误。

class INST
{
public:
boost::mutex m_mutex;
};

std::vector<INST> m_inst;

错误 C2248: 'boost::mutex::mutex' : 无法访问在类 'boost::mutex' 中声明的私有成员 见'boost::mutex::mutex'的声明

但是,我的其他班级很好,

class VIEW
{
public:
boost::mutex m_mutex;
};

VIEW m_view;

我在这里遗漏了什么吗?我尝试将 m_mutex 声明为私有,但仍然遇到同样的问题。

谢谢。

【问题讨论】:

  • C++ 错误通常是复杂而冗长的。确保复制完整的错误消息(可能是多个错误 XXX: 行),因为每一行都会为拼图添加一些信息(在这种情况下,可能是复制构造函数不可用或它在定义复制构造函数时发现了错误
  • 谢谢大卫,我是多线程编程的新手,你能提出解决问题的方法吗?我有一个共享向量,多个线程可能同时访问向量的不同部分。

标签: c++ boost


【解决方案1】:

互斥锁不能是copied,因此您不能将它们放在会复制互斥锁的容器中。该错误可能是指互斥体的私有副本构造函数。

【讨论】:

  • 谢谢,不,您能提出解决问题的方法吗?我有一个共享向量,多个线程可能同时访问向量的不同部分。
  • 在容器中放置(智能)互斥体或包含互斥体的类的指针。或者用一个互斥锁保护整个向量。 (如果适合您的任务,也可以使用数组)
  • 如果我错了,请纠正我,如果我使用全局互斥锁来保护整个向量,是否意味着一次只有一个线程可以访问整个向量?我试图允许多个线程同时访问向量的不同部分。谢谢。
  • @2607:这完全取决于您要解决的问题以及您打算如何解决它。想到的第一个解决方案是提供一个复制构造函数(和赋值运算符),它不会尝试复制互斥锁(互斥锁不是对象的一部分,而是处理线程安全的辅助工具——顺便说一句,它应该可能是mutable)。
  • @nos: 如果你对互斥锁使用共享指针,你会打开代码带来不必要的副作用,如object a; object b(a); --> 现在ab share 单个互斥体,这可能是不需要的。
【解决方案2】:

我意识到这个问题真的很老了,但我今天早些时候偶然发现了同样的问题,谷歌把我带到了这里。但是,建议的解决方案不适合我,所以我想描述一下我是如何在自己的项目中解决它的。

我有一个和你一样的类向量,我以这样一种方式管理这些类,以便一旦开始访问向量的成员,向量将永远不会再调整大小。不过,在处理开始之前,我确实希望能够在开始时多次调整向量的大小。我还希望允许线程以随机访问方式对向量中的任何项目进行操作。

我通过在类的构造函数中动态分配互斥锁并在析构函数中销毁它来解决互斥锁的问题。自然,如果您这样做,您必须保证在删除互斥锁时没有人在等待它。这个解决方案对我有用,因为我从不将对象复制到向量之外,我只在容器内部访问它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 2012-07-09
    • 1970-01-01
    • 2012-12-13
    • 2011-08-05
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多