2016-04-27 5 views
-1

私はクラス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); 

object2Class2 * object2としてClass1で宣言され、どこか初期化されています。

ThreadHelper機能はClass1内部staticとして宣言されており、以下のように構成されています

void * Class1::ThreadHelper(void * thread_args) { 
    struct args * targs = (struct args*) thread_args; 
    targs->object2->LoadFile(targs->cmd); 
} 

このすべては、セグメンテーションフォールトを引き起こしています。どうすれば解決できますか? また、Run関数は順番に実行されるため、次のスレッドが終了する前に新しいスレッドが作成されると問題になることはありますか?

答えて

3

ローカル変数thread_argsへのポインタをスレッドに渡すのが問題です。あなたはそれのいずれかのグローバル変数にする必要があります - それは外の機能を移動したり、ヒープ上に割り当て、すなわち:あなたはその作業で行われた後、スレッド関数の内部でそれを削除することを忘れ

pthread load_thread; 
struct args* thread_args=new 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); 

をしていけない(あなたはSTDを使用することがあります。 :それを自動的にするためのunique_ptr)。 object2と同じ -


は今、私はあなたがClass1struct args thread_args;を移動することができます参照してください。

+0

私は2番目のことを試しましたが、それでも私には同じことが与えられます。私は最初の解決策を今すぐ試してみます – charles

+0

2番目の提案は@charlesです:スレッドが終了する前に 'thread_args'を保持する' Class1'インスタンスが破棄されないようにしてください。 – marcinj

関連する問題