1

でトラブルを起こすことがありましたpthread_exit()pthread_exit()私はそのような方法で使用する方法がないことを知っています

pthread_exit(&some_local_variable);

次のように常に pthread_exit() を使用する必要があります。

pthread_exit("Thread Exit Message or something necessary information");

テスト目的で簡単なプログラムをコーディングしたことがあります。2 つの整数の足し算、引き算、掛け算、割り算の 4 つのスレッド関数をそれぞれ作成しました。次に、これらの操作を 4 つの異なるスレッドで実行しながら、操作の結果をpthread_exit(). つまり、次のようなものです。

pthread_exit(&add_result);

pthread_exit()CentOS 6 でコードを実行すると、そのようには使用できないため、目的の結果 (つまり、すべてのスレッドからのガベージ値) が得られました。しかし、私は混乱しました。初めて、Ubuntu 11.10 でそのコードを実行し、3 つのスレッドから 3 つの完全に正しい結果 (操作の正しい結果) と 1 つのスレッドからガベージ値を得たからです。なぜ 3 つのスレッドが正しい操作結果を返すのか、これは私を混乱させました。

さらに、これらのスレッドには異なるスリープ時間を使用しました。スリープ時間が最も短いスレッドがガベージ値を与えることがわかりました。

gcc はこれら両方のオペレーティング システムのコンパイラであるため、一方のシステムにこのようなバグがあるのはなぜですか? 私のような初心者のプログラマーは混乱します。バグでない場合、なぜこれが起こっているのか説明してもらえますか?

4

3 に答える 3

4

あなたの答えはpthread_exitドキュメントにあると思います。add_resultあなたは、ローカル変数のように見える へのポインタを返したと言っています。

回答する可能性のあるドキュメントの引用は次のとおりです。

スレッドが終了した後、スレッドのローカル (自動) 変数へのアクセスの結果は未定義です。したがって、終了スレッドのローカル変数への参照は、pthread_exit() value_ptr パラメータ値に使用しないでください。

スレッド化された関数に void* 引数を使用して、操作の実際の結果を含む構造体を使用できます。

于 2012-04-05T11:23:11.653 に答える
3

pthread_exitへのポインタを取るだけvoidです。変数ローカルのアドレスをスレッドに渡すと、そのメモリが別の目的で再利用されることがあります。時々それはまだそこにあります。スレッドが終了した後、システムの一部が移動して、使用していたすべてのメモリがガベージ値に設定されていることを確認するという保証はありません。

これはバグではありません。システムは、ユーザーが要求したことを正確に実行しています。

ボーナス関連の回答 -ローカル変数のメモリはそのスコープ外でアクセスできますか?

于 2012-04-05T11:23:50.457 に答える
1

の唯一の要件pthread_exit(foo)は、それがfoo十分に長く存続するものを指していることです。ローカル変数はそうではありませんが、malloc されたメモリはそうです。

于 2012-04-05T11:24:36.723 に答える