私はこの問題を抱えています。いくつかのジョブを実行するためにManagerいくつかの を作成する が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_vecWorkerWorker
これによりSegment fault、スレッドroutineが実行thisされ、渡された引数として使用され、の展開this中に破棄されるため、 が発生vectorします。
_workers_vecからvector<Worker>に変更する以外に、引数で渡されたvector<Worker *>を処理する方法について何か良いアイデアはありますか?routine