课程定义
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 :(得分:1)
以下是一些可能导致代码出现分段错误的事情:
TaskWorker
的实例可能是NULL
,因为void* waitForResponse(void* w)
中没有空检查。这可能会在第一次访问成员变量时导致void TaskWorker::waitForClientResponse()
中的访问冲突。
请避免任何不安全的C样式字符串操作。例如,如果您对strcpy
不够谨慎,它将溢出缓冲区并覆盖一些不相关的内存。
如果多个线程共享clientList
(或任何其他共享资源),请确保您具有适当的互斥机制。