多线程程序导致分段错误,使用std :: list :: push_back

时间:2013-11-01 12:50:46

标签: c++ multithreading

课程定义

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);
}

更新

我编译了没有调试符号的代码,崩溃就消失了。这是我最新的观察结果 任何人都可以告诉我这里发生了什么?

1 个答案:

答案 0 :(得分:1)

以下是一些可能导致代码出现分段错误的事情:

  • TaskWorker的实例可能是NULL,因为void* waitForResponse(void* w)中没有空检查。这可能会在第一次访问成员变量时导致void TaskWorker::waitForClientResponse()中的访问冲突。

  • 请避免任何不安全的C样式字符串操作。例如,如果您对strcpy不够谨慎,它将溢出缓冲区并覆盖一些不相关的内存。

  • 如果多个线程共享clientList(或任何其他共享资源),请确保您具有适当的互斥机制。