私はクラスClass1
を持っていて、メソッドClass1::Run
があり、これは逐次的に呼び出されます。このメソッドの中で、いくつかのテキストファイル、時には大きなものをロードして、いくつかの操作を実行したいと思います。このテキストファイルは読み込みに時間がかかるので、別のスレッドでロードして準備が整うのを待っている間にいくつかの代替操作を実行したいと思います。このスレッドでは、別のクラスのメソッドを呼び出してファイルをロードしたいと考えています。ファイル読み取りのためのpthread_createセグメンテーションフォルト
私は、次の構造体を作成しました:
struct args {
int cmd;
Class2 * object2;
}
これはClass1::Run
の構造である:
pthread load_thread;
struct args thread_args;
thread_args.cmd = 0; //this is used to specify the kind of file to be loaded
thread_args.object2 = object2;
pthread_create(&load_thread, NULL, &ThreadHelper, (void*) &thread_args);
object2
はClass2 * object2
としてClass1
で宣言され、どこか初期化されています。
ThreadHelper
機能はClass1
内部static
として宣言されており、以下のように構成されています
void * Class1::ThreadHelper(void * thread_args) {
struct args * targs = (struct args*) thread_args;
targs->object2->LoadFile(targs->cmd);
}
このすべては、セグメンテーションフォールトを引き起こしています。どうすれば解決できますか? また、Run関数は順番に実行されるため、次のスレッドが終了する前に新しいスレッドが作成されると問題になることはありますか?
私は2番目のことを試しましたが、それでも私には同じことが与えられます。私は最初の解決策を今すぐ試してみます – charles
2番目の提案は@charlesです:スレッドが終了する前に 'thread_args'を保持する' Class1'インスタンスが破棄されないようにしてください。 – marcinj