Ошибка сегментации C ++ на vector.erase () - PullRequest
1 голос
/ 31 марта 2011

У меня проблема с вектором в моей программе. Я нашел много похожих проблем, но не нашел решения. Этот код в новой теме:

    while(status == RUN){
    msleep(20);
    while(status != DESTROY && (!actions.empty()) ){
        item = actions.begin();
        (*item)();
        cout<< "try remove the action!\n";
        item=actions.erase(actions.begin());
        cout << "everything ok!\n";
    }
}

вывод:

action!
try remove the action!
Segmentation fault

Actions - это вектор

struct action{
    string query;
    long size;
    void operator()(){
        cout << "action!\n";
    }
};

обновление

Настоящая проблема: структура с этим методом уже уничтожена.

class mthread{
    ...
    deque<action> actions;
    ...
    operator(){
        (loop above)
    }
};

class mthread_holder{
    mthread* mt;
    operator()(){
        (*mt)();
    }
    mthread_holder(mthread *p){
        mt = p;
    }
};

тогда я просто использую:

threads.back().thrd = new boost::thread(mthread_holder(mthrd));

Я думаю, мне нужно хранить его более безопасно

Как я могу сохранить вызываемое в потоке и удерживать указатель на него без boost :: bind?

1 Ответ

1 голос
/ 31 марта 2011

На догадку: у вас нет никаких замков, защищающих вашу actions очередь, не так ли?

При доступе к одной и той же структуре данных из нескольких потоков вам нужно использовать блокировки или другие конструкции синхронизации для защиты от одновременного доступа, иначе могут возникнуть странные вещи (сбои или что-то еще хуже).

Пока вы это делаете, вам, вероятно, следует использовать условную переменную, чтобы избежать пробуждения каждые 20 мс, даже если ничего не поделаешь. И используйте deque для очереди, а не vector.

...