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

multithreaded program causes segmentation fault, uses std::list::push_back

本文关键字:list ush back std 使用 程序 分段 错误 多线程      更新时间:2023-10-16

类定义

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

更新

我在没有调试符号的情况下编译了我的代码,崩溃消失了。这是我的最新观察。
任何人都可以启发我这是怎么回事?

以下是可能导致代码中出现分段错误的一些因素:

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

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

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