[解決済み] pthread_exit vs. return
2022-02-05 07:19:26
質問
以下のように定義された結合可能なpthreadランナー関数があります。
void *sumOfProducts(void *param)
{
...
pthread_exit(0);
}
このスレッドはメインスレッドに参加することになっています。
私のプログラムをValgrindで実行すると、いつも次のようなメッセージが表示されました。 以下のようなリーク :
LEAK SUMMARY:
definitely lost: 0 bytes in 0 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 968 bytes in 5 blocks
suppressed: 0 bytes in 0 blocks
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 10)
pthreadsのマニュアルページを確認したところ、こう書いてありました。
The new thread terminates in one of the following ways:
* It calls pthread_exit(3), specifying an exit status value that is
available to another thread in the same process that calls
pthread_join(3).
* It returns from start_routine(). This is equivalent to calling
pthread_exit(3) with the value supplied in the return statement.
* It is canceled (see pthread_cancel(3)).
* Any of the threads in the process calls exit(3), or the main thread
performs a return from main(). This causes the termination of all
threads in the process.
奇跡的に、pthread_exit()をreturn文に置き換えたところ。 漏れがなくなった .
return(NULL);
実際の質問は3つあります。
- return文がリークしなかった理由を誰か説明してください。
- 両者の間には、スレッドからの終了に関して、何か根本的な違いがあるのでしょうか?
- もしそうなら、どのような場合に一方を他方より優先させるべきでしょうか?
どのように解決するのですか?
以下の最小限のテストケースは、あなたが説明した動作を示します。
#include <pthread.h>
#include <unistd.h>
void *app1(void *x)
{
sleep(1);
pthread_exit(0);
}
int main()
{
pthread_t t1;
pthread_create(&t1, NULL, app1, NULL);
pthread_join(t1, NULL);
return 0;
}
valgrind --leak-check=full --show-reachable=yes
が呼び出した関数から割り当てられた5つのブロックを示しています。
pthread_exit()
はアンフリーですが、プロセス終了時にまだ到達可能です。 もし
pthread_exit(0);
に置き換えます。
return 0;
5ブロックは確保されません。
しかし、大量のスレッドを作成して結合するテストを行うと、終了時に使用中の解放されていないメモリの量が
ない
が増加します。 このことと、まだ到達可能であることから、glibcの実装の奇妙な点を見ているだけであることがわかります。 glibcのいくつかの関数は、メモリを
malloc()
glibc はプロセスの終了時にこのメモリを解放することを気にしません。
関連
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】LEALアセンブリ命令は何をするのですか?
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み】.axfファイルとは何ですか?