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