2011-09-16 8 views
3

pthread実行関数から結果を返すことについて質問があります。Pthreadの返却結果

関連コード:resultthread_funcのスタック上に存在し、thread_func戻った後存在しなくなるので、それが安全に動作するはずのように私に

void* thread_func(void* args) 
{ 
    float result = 0; 
    // ...do something 
    return (void*)&result; 
} 

// ... using code 
float answer; 
pthread_join(pthread_handle, &answer); 

は、ソリューションのこの種はいないようです。しかし、私がやったすべてのテストで、完璧に動作するようです。なぜこれが安全だと誤解していますか?そうでない場合、偶然のテストのためにテストが行​​われただけで、安全に戻り値をthread_funcから安全に戻すにはどうすればよいですか?

+0

これは間違いなく、これを非常に徹底的にテストしていない可能性があります。 'valgrind'を使い始めましょう。 –

答えて

10

これは安全ではありません。あなたは単に幸運な(またはむしろ不運)ことがあります。関数が終了すると、すべての自動変数が失われます(したがってポインタは役に立たない)。

  • 使用mallocといくつかのメモリを使用して結論として

に参加します、そのメモリ

  • 使用静的オブジェクト(インスタンスのグローバル変数)関数によって渡さ
  • 使用メモリを返すこと関数が終了した後も存続します。

  • +0

    私の呼び出しコードでは、私はfree(&answer)を呼び出しますか?あるいは、私はそれをfloat *に変更しなければならないでしょうか?返答の結果が終わったらfree(answer)を呼び出しますか? – helloworld922

    +1

    'free(&answer)'は**決して有効ではありません。C.あなたは後者をしなければなりません。 –

    +0

    @ helloworld922 'malloc'で取得したものに対してのみ' free'を呼び出します。 2番目の選択肢はうまくいくようです。 – cnicutar

    関連する問題