pthread_create()
次のようなものを使用しながら、4番目の引数として構造体を渡してみました。
pthread_create(&tid1, NULL, calca, &t); //t is the struct
これで、構造体の変数(ta、tb、またはtc)にアクセスしようとすると、エラーが発生し続けます。構造体または共用体ではないもののメンバーを要求します。
構造体をスレッドに渡すために使用できる代替メソッドは何ですか?
pthread_create()
次のようなものを使用しながら、4番目の引数として構造体を渡してみました。
pthread_create(&tid1, NULL, calca, &t); //t is the struct
これで、構造体の変数(ta、tb、またはtc)にアクセスしようとすると、エラーが発生し続けます。構造体または共用体ではないもののメンバーを要求します。
構造体をスレッドに渡すために使用できる代替メソッドは何ですか?
おそらく、pthread_create と同じスコープで構造を作成しています。スコープが終了すると、この構造は無効になります。
ヒープ上の構造体へのポインターを作成して、その構造体ポインターをスレッドに渡してみてください。そのメモリをどこかで削除することを忘れないでください(二度と使用しない場合はスレッド内、または不要になった場合)。
また、サイバーコンテが述べたように、異なるスレッドからそのデータにアクセスする場合は、ミューテックスまたはクリティカル セクションでアクセスをロックする必要があります。
Edit May 14th, 2009 @ 12:19 PM EST : また、他の人が言及したように、パラメーターを正しい型にキャストする必要があります。
グローバル構造である変数を渡す場合(これを主張しているようです)、スレッド関数は次の型にキャストする必要があります。
void my_thread_func(void* arg){
my_struct foo = *((my_struct*)(arg)); /* Cast the void* to our struct type */
/* Access foo.a, foo.b, foo.c, etc. here */
}
または、構造体へのポインタを渡す場合:
void my_thread_func(void* arg){
my_struct* foo = (my_struct*)arg; /* Cast the void* to our struct type */
/* Access foo->a, foo->b, foo->c, etc. here */
}
スレッド関数内にいる場合、渡す引数は void* です。構造体として使用する前に、構造体にキャストする必要があります。
void my_thread_func(void* arg){
my_struct foo = (my_struct)(*arg); /* Cast the void* to our struct type */
/* Access foo.a, foo.b, foo.c, etc. here */
}
セマフォを作成する
構造体へのポインターとセマフォ ハンドルで構成される別の構造体を作成します。
この新しい構造体へのポインタを pthread_create に渡します
親スレッド、つまり pthread_create を呼び出したスレッドで、セマフォを待機します。
子スレッドで、構造体のメンバーをローカル変数にコピーするか、別の場所に保存します
子スレッドで、セマフォにシグナルを送る
親スレッドで、セマフォを閉じます
私は他の回答に記載されているのと同じ過ちを犯すことがよくありましたが、今ではエラーの可能性をスレッド関数から pthread_create 呼び出しに移す、わずかに異なるアプローチをとっています。
「通常の」方法でスレッド関数を宣言および定義します。
void *ThreadFunction(sPARAMETERS *Params) {
// do my threading stuff...
}
pthread_create を呼び出すときは、キャストを使用する必要があります。
pthread_create(&ThreadId,0,(void*(*)(void*)) &ThreadFunction,&Params);
Params で & を使用することを忘れることはほとんどありません。コンパイラーは、反対側で行った間違いを処理します。コールバックにも最適です。
共有メモリまたはグローバル変数 (他にその引数が必要ない場合)、またはこれらがデータをフィードしているスレッドである場合はリンクリストを使用できます。
スレッド共有されている変数をロックすることを忘れないでください。
ただし、実際の問題のあるコードがなければ、現在の実装で何が間違っているのかわかりません。
このエラー メッセージは、ポインターを逆参照していないことを意味します。
「t->a」ではなく「ta」と言っています。
[me@myhost ~]$ cat testitx.c 構造体 x { int a、b; }; int main(int argc, char *argv[]) { 構造体 xy, *z; z = &y; ザ = 10; } [me@myhost ~]$ cc -c testitx.c testitx.c: 関数 `main' 内: testitx.c:10: エラー: 構造体または共用体ではないメンバー `a' の要求 [me@myhost ~]$