我围绕着这个,但却找不到错误。任何人都可以帮助我做错编程。
一个boost::thread
在套接字上收到strings
,将它们拆分为vector<string>
,然后将它们排序到shared class
内的正确变量中。从那里读取其他线程。我尝试通过mutex使其线程安全,如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);
答案 0 :(得分:1)
我认为在函数外部使用tmp
的问题是互斥析构函数将(或可以)在从tmp
到永久变量的复制操作之前运行,从而导致一个小窗口{{ 1}}可以被覆盖并导致潜在的数据竞争。
如果您创建简单的假互斥/字符串类,可以看到这一点,这些类显示何时运行它们。最后的代码为我输出以下内容(VC ++ 2015):
tmp
重要的线条缩进显示您的互斥锁在重要副本发生之前被销毁/释放。如果您将CSimpleString Raw Constructor (g_tmp)
CSimpleString Raw Constructor (result)
CFakeMutex Constructor
CSimpleString Copy Raw Operator (TestFunction)
CSimpleString Copy Constructor (TestFunction)
CFakeMutex Destructor
CSimpleString Copy Operator (TestFunction)
CSimpleString Destructor (TestFunction)
Result = TestFunction
放在函数中,则操作顺序似乎不会发生变化,但由于tmp
是局部变量,因此不存在可能发生的潜在数据争用。
以下是测试的基本代码。
tmp
答案 1 :(得分:0)
Bo Persson指出了正确的方向。我将vector<string> tmp
放入其使用的函数中,并且运行稳定。
vector<string> getvec(int type) {
boost::shared_lock<boost::shared_mutex> lock(mtx);
vector<string> tmp; //moved into the function
switch(type) { ...}}
我无法解释原因,但它运行稳定。如果有人可以继续这样做,那就太好了。