5

ファイル出力を実行するためのメイン スレッドと 1 つのデーモン スレッドがあるプロジェクトに取り組んでいます。私のメインスレッドには、pthread_t * _daemon削除したいフィールドがありますが、明らかに NULL を返した後でのみです (使用するとメモリリークが発生_daemonすることを理解しています)。pthread_exit()

ビジーウェイトなしでそれを行うにはどうすればよいですか? 条件変数を使用しようとすると、問題が発生します。signal()フォームを呼び出し_daemonてメイン スレッドを起動すると、NULL が返さ_daemonれる前にフォームが削除されます。_daemon

私がしたことは、プログラムの起動時にロックされ、_daemon戻る前にロックが解除されるミューテックスロックを使用することです。忙しい待機を引き起こさないより良い方法はありますか?

4

2 に答える 2

5

pthread_detach()あなたが探していることをします。複雑さを大幅に軽減して、問題を解決できるようです (漏れはありません)。

pthread_detatch(_daemon)そのため、スレッド自体がまだ実行されているかどうかを心配することなく、他のスレッド内で処理が完了したときに安全に呼び出すことができます。スレッドを終了するのではなく、終了時にスレッドをクリーンアップします。

ドキュメントから:

このpthread_detach()関数は、そのスレッドが終了したときにそのスレッド用のストレージを再利用できることを実装に示す必要があります。スレッドが終了していない場合、スレッドを終了pthread_detach()させません。

次のように設定することで、実際に切り離された状態でスレッドを作成して開始できますattr

   int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

作成時に適切に。マンページには次のように書かれpthread_create()ています:

切り離されたスレッドが終了すると、そのリソースは自動的に解放されてシステムに戻されます。[中略] スレッドをデタッチすることは、アプリケーションが終了ステータスを気にする必要のないある種のデーモン スレッドに役立ちます。デフォルトでは、(pthread_attr_setdetachstate(3) を使用して) 切り離された状態でスレッドを作成するように attr が設定されていない限り、新しいスレッドは結合可能な状態で作成されます。

于 2012-05-13T09:17:11.033 に答える
1

pthread_tは であるunsigned long intため、ポインタを作成する必要は実際にはありません(関数でそのpthread_tアドレスを使用することもできます)。これは作成されたスレッドの数であるため、それと通信するためです-結合、デタッチ機能などに使用されます)。pthreadpthread

于 2012-10-29T15:42:59.140 に答える