многопоточная программа вызывает ошибку сегментации, использует std :: list :: push_back

0

Определение класса

class TaskWorker
{
    ...
    private:
            std::list<client_det*> clientList;
    ...

    public:
            void waitForClientResponse();
};

Функция для запуска функции члена класса в виде потока

void* waitForResponse(void* w)
{
    TaskWorker* worker = static_cast<TaskWorker*>(w);
    worker->waitForClientResponse();
}

Реализация функции потока

void TaskWorker::waitForClientResponse()
{
    client_det* obj = new client_det();
    ...
    clientList.push_back(obj); //valgrind says access violation
    ...
}

Что-то не так в этой реализации?
Есть ли какое-либо ограничение в функции члена класса потока, доступ к списку частных членов?

Вызов темы

int TaskWorker::assign_and_wait(std::list<MulticastGroupInfo*> groupList)
{
     ...
     ...               
     pthread_t tid;
     pthread_create(&tid, NULL, waitForResponse, this);
}

Обновить

Я скомпилировал свой код без символов отладки, и авария исчезла. Это мое последнее наблюдение.
Кто-нибудь может просветить меня, что здесь происходит?

  • 0
    Вы уверены, что w не NULL ?
  • 0
    @HAL Я добавил код, который вызывает функцию потока. Я передаю this из другой функции-члена. Это правильно?
Показать ещё 5 комментариев
Теги:
multithreading

1 ответ

1

Вот несколько вещей, которые могут вызвать ошибку сегментации в вашем коде:

  • Экземпляр TaskWorker может быть NULL как нет нулевой проверки в void* waitForResponse(void* w). Это может привести к нарушению доступа в void TaskWorker::waitForClientResponse() при самом первом доступе к переменной-члену.

  • Пожалуйста, избегайте каких-либо небезопасных операций с строкой стиля C. Например, если вы не достаточно осторожны с помощью strcpy, он переполнит ваш буфер и перезапишет некоторую несвязанную память.

  • Если несколько потоков совместно используют clientList (или любой другой общий ресурс), убедитесь, что у вас есть соответствующий механизм взаимного исключения.

  • 0
    Если бы w был NULL worker->waitForClientResponse() сам бы не worker->waitForClientResponse()
  • 1
    @cppcoder: если w был NULL, значит worker->waitForClientResponse() вызывает неопределенное поведение. Обычно не виртуальные вызовы функций-членов с нулевым указателем выглядят успешными, пока вы не попытаетесь получить доступ к переменной-члену несуществующего объекта. (Например: ideone.com/4jr2ur )
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню