struct中的boost :: mutex的未定义引用

时间:2016-11-11 22:49:08

标签: c++ boost-mutex

我想在我的struct Cell 的函数 add 中使用boost :: mutex。这是我在Detector.h中的结构的定义

class Detector {

private:
    struct  Cell{
        static boost::mutex mutex_;
        double energy;
        double sqrt_energy;
        int histories;

        inline Cell(): energy(0.f), sqrt_energy(0.f), histories(0.f) {
            boost::mutex mutex_;  //I tried with and without this line
        };  

        inline void add(double new_energy) {
            mutex_.lock();
            energy += new_energy;
            sqrt_energy += new_energy*new_energy;
            ++histories;
            mutex_.unlock();
        };
    };

    typedef std::vector<Cell> CellVector;
    CellVector EnergyPrimary;

}

我在 Cell 的向量中使用Detector.cpp中的 add 函数。

Dectetor::Detector() : {
  nVoxelX=1024;
  nVoxelY=1024;
  size=nVoxelX*nVoxelY;
  EnergyPrimary=CellVector(size);
}

void Detector::Score(int cellID, double new_energy) {
  EnergyPrimary[cellID].add(new_energy);
}

当我尝试编译它时,我对mutex_.lock()和mutex_.unlock()有一个未定义的引用错误。但是为什么在我使用类似的函数重载运算符+ =时(当我调用EnergyPrimary [cellID] .energy + = new_energy;)之前它是否正常工作?

inline bool operator+= (double new_energy) {
    mutex_.lock();
    energy += new_energy;
    mutex_.unlock();
    return false;
};

1 个答案:

答案 0 :(得分:0)

您已将mutex_定义为类的静态成员,这意味着它不是每个实例的成员。因此,您无法在构造函数中初始化。相反,它必须在源文件中初始化,在您的情况下很可能是Detector.cpp

初始化的代码应为:

boost::mutex Detector::Cell::mutex_;

如果您不希望它是静态成员(您希望每个单元格有一个互斥锁),请删除static限定符。