程序在一段时间后终止“std :: bad_alloc”

时间:2016-02-14 12:43:06

标签: c++ boost-thread bad-alloc

我围绕着这个,但却找不到错误。任何人都可以帮助我做错编程。
一个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);

2 个答案:

答案 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) { ...}}

我无法解释原因,但它运行稳定。如果有人可以继续这样做,那就太好了。