• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:pthread_createでタスクの構造体にて)

pthread_createでタスクの構造体にて

このQ&Aのポイント
  • pthread_createという関数を使用して、スレッドタスクを作成しようとしています。
  • タスクの構造体に新しい構造体を追加し、その値を使用しようとしていますが、実行時にSegmentation fault (core dumped)エラーが発生しています。
  • この問題を解決するための方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>グローバル宣言ではダメなんでしょうか? 場所ではなく、前のソースで、 pEnv->i < ここまで一度も、この変数を使っていないのですよ。 なので、pEnvの値が不定 ポインタもどこも指していない状態(おそらく0だと思いますが) 今回、動いたのは、 env_t * pEnv; if(pthread_create(&thread03 , NULL , thread_func03 ,(void*)&pEnv) この2行のためですね。 ただし、間違っているかと。。 プロトタイプは、 int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); の関数ですので、 (void*)&pEnv は、 void ** になっていませんか? (void*)pEnv < & は、いりません。 で、この関数を呼ぶ「前」に、 pEnvを初期化してください。 グローバルでもローカルでもOKです。 実体を持たないから、エラーが出ているだけなので、 実体を持たせれば、目的は達成されると思います。 env_t vEnv; < これなら実体 env_t *pEnv; < これなら参照体(要するにポインタ) ----------- env_t vEnv; これと if(pthread_create( ........................,(void*)&vEnv) これだけで、直ると思いますよ。 pEnvを使いたいのであれば、事前に初期化します。 env_t vEnv; < 実体 env_t *pEnv=&vEnv; < 実体を参照させた。 if(pthread_create( ........................,(void*)pEnv) &はなしで、そのまま、使う。 の2通りかな。 ほぼ、これで全部終りですね。

techhouse
質問者

お礼

回答頂きありがとうございます。お世話になっております。返事遅れてもうしわけありません。 解決できました。 この環境変数関連の構造体はちょっと別マイコンで使用していたプログラムを使っていたのですが、これをLinuxのgccプログラミングでも使えないかと思いやってみました。 実態がないというエラーだったのですね。 マイコンのプログラミングではこの実態に当たるところがSRAMのメモリのメモリ番地を指しているようでした。 env_t * pEnv; ----------------(中略)---------------- pEnv = (env_t *)(FLASH_ENV_ADDR + sizeof(env_hdr_t)); このような宣言をしていました。 FLASH_ENV_ADDRってのが0x600000番地とかなってました。 ポインターとか苦手だったのでとても助かりました。

その他の回答 (1)

回答No.1

実際のタスク env_t * pEnv; //グローバル宣言 void *event(void *param) { ~~~~ pEnv->i = 0x01;  <-ここ pEnvはどこで初期化しました? ポインタに実体がないので、セグメンテーションエラーがでただけではないかと 思いますが。 pEnv= なにか?の”実体”の代入がないと。 だと思いますが、 見当違いならすいません。

techhouse
質問者

お礼

回答頂きありがとうございます。 ”pEnvはどこで初期化しました?”ということに関して、勉強不足で初期化というのをどのようにやればよいかわからない状態です。 pthread_create(&thread03 , NULL , thread_func03 ,void*)&pth) このpthread_create関数の第4引数に設定した項目が初期化に当たりますでしょうか? main関数でenv_tをこのように宣言したら使えるようになりました。 int main(int argc, char *argv[]) { pth_arg pth; env_t * pEnv; --------(中略)---------------------------------- if(pthread_create(&thread03 , NULL , thread_func03 ,(void*)&pEnv) !=0) { perror("pthread_create()"); } --------(中略)---------------------------------- } このようにすることで void *event(void *param) { env_t * pEnv; pEnv = param; --------(中略)---------------------------------- pEnv->i = 0x01; --------(中略)---------------------------------- } このようにすることでpEnvが動作することができたのですが、 pthread_create関数の第4引数にデータをセットしなければ、スレッドでの構造体を使用することはできないのでしょうか? グローバル宣言ではダメなんでしょうか? どうぞ、ご教示頂きますよう、お願い致します。

関連するQ&A