【发布时间】:2016-02-14 12:43:05
【问题描述】:
我对此进行了思考,但找不到错误。任何人都可以帮助我在我做不好编程的地方。
一个boost::thread 通过套接字接收strings,将它们拆分为vector<string>,并将它们分类到shared class 内的正确变量中。其他线程从那里读取。我试图通过互斥锁使其线程安全,如here 所示。
感谢任何帮助,即使是小提示 :)
这就是程序终止的方式:
Looping...<enter to exit>
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
这是对应的文件。和ROS纠缠不清,但那部分不应该是判决。
class shared
{
public:
shared() : count(0) {/*emp. body*/ } //constructor
void setvec(vector<string> &strVec, int type){
boost::upgrade_lock<boost::shared_mutex> lock(mtx);
boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
switch(type) {
case 1: typ1acc = strVec; setsensor[0] = true; break;
case 2: typ2mag = strVec; setsensor[1] = true; break;
case 3: typ3 = strVec; setsensor[2] = true; break;
}/**/
}
vector<string> getvec(int type) {
boost::shared_lock<boost::shared_mutex> lock(mtx);
switch(type) {
case 1: tmp = typ1acc; break;
case 2: tmp = typ2mag; break;
case 3: tmp = typ3; break;
}
return tmp;
}
private:
boost::shared_mutex mtx;
vector<string> tmp;
vector<string> typ1acc;
vector<string> typ2mag;
vector<string> typ3;
};
shared c; //class object
类从多个 boost::threads 中调用:
//socket function which sorts vectors into shared class
//this happens from one boost::thread
int type; //key sort by sensor type
vector<string> strVec;
c.setvec(strVec,type);
//multiple boost::threads call this to read the vectors
//this happens from multiple boost::thread
strVec = c.getvec(type);
【问题讨论】:
-
你确定所有这些代码都需要重现问题吗?它看起来很长......
-
好的,我会尝试进一步追踪,然后编辑帖子。
-
您可能还想添加“一段时间”在程序终止之前的时间。你复制了很多
vector<string>s,最终可能导致内存碎片。 -
终止时间约。 4 分钟。谢谢,这是个好主意。当您提到复制时,我怀疑 tmp 向量,因为多个线程进入函数 getvec
标签: c++ boost-thread bad-alloc