我有这个问题,有一个Manager会创建几个Workers来做一些工作,每个worker会触发一个线程,代码如下:
void Manager::create_workers(int n)
{
_workers_vec.push_back( Worker() ); //save workers in Manager::_workers_vec
_workers_vec.back().start(); //call the newly created worker's start() to fire a thread
}
void Worker::start()
{
pthread_create(&_thread_id, NULL, routine, this); //here is the problem
}
问题是,Worker的线程例程将this作为例程参数以使用 的某些数据成员Worker,但是Worker对象被创建并推回Manager::_workers_vec,当_workers_vec的容量不足以容纳更多Worker对象时,它必须扩展,在此期间旧Worker对象将被复制到新分配的空间,然后被销毁。
这将导致Segment fault, 因为线程routine正在运行并this用作传入的参数,并且在' 扩展this期间被破坏。vector
除了_workers_vec从vector<Worker>to更改之外vector<Worker *>,关于如何处理routine' 传入参数的任何更好的想法?