2011-02-01 12 views
7

背景:私は、多くのプログラムで使用されているロギングライブラリに取り組んでいます。
私は各スレッドに人間が読める名前を割り当てていますが、メインスレッドは "main"を取得する必要がありますが、各メインの先頭にコードを必要とせずにライブラリ内からその状態を検出できるようにしたいと思います) 関数。pthread_selfがプロセスのメイン(最初の)スレッドであるかどうかを確認する方法はありますか?

注:ライブラリコードは、メインスレッドから常に最初に入力されるとは限りません。

+0

人が読める他の名前はどのようにして取得できますか? – Potatoswatter

+0

より具体的には、 'main'が適合しないパターンは何ですか? – Potatoswatter

+0

システム内の大部分のスレッドは、ほんの一握りの方法で起動されます。仮想std :: string name()関数に依存できる共通のコードがあります。しかし、メインスレッドは異なります。 –

答えて

11

これは、

のMac OS Xは、直接、文書化アプローチで一つだけのようです...任意のポータブルおよび一般的な方法であなたがにしているプラ​​ットフォームに応じて、ちょっとなんとかですが、絶対にありませんそのpthread.hファイルに従って:

/* returns non-zero if the current thread is the main thread */ 
int pthread_main_np(void); 

Iはまた、FreeBSDは)(pthread_main_npを定義pthread_np.hヘッダを有しているので、これは(少なくとも8.1)をあまりにもFreeBSD上で動作する必要があることを見出し、OpenBSDの(4.8以上) pthread.hにもpthread_main_np()が定義されています。 _npは、移植性がないことを明示的に示しています。

それ以外の場合は、プロセスのPIDを現在のスレッドのTIDと比較するだけです(一致する場合はそのスレッドがメインです)。 これは必ずしもすべてのプラットフォームで動作するとは限りません。実際にはTIDを得ることができるかどうか(例えばOpenBSDではできません)、もしそうであれば、スレッディング・サブシステムには必ずしも関係のない独自のアカウンティングがあります。

また、一部のプラットフォームでは、メインスレッドのTIDとして一定の値が戻ってくることがわかりました。

私がチェックしたプラットフォームの概要:

  • のLinux:は、thr_self、ここでは可能ではない:ここに可能、システムコール(SYS_gettid)== GETPID()は、あなたが
  • のFreeBSDを望むものです()
  • のOpenBSD)(GETPIDするランダムと関係なしに思える:ここに可能、_lwp_self()は常にメートルのための1を返します。ここでは可能ではない、NetBSDはTID
  • を取得する方法はありませんAINスレッド
  • Solarisの場合:ここで可能、pthread_self()は常にので、基本的には、Mac OS X、FreeBSDやOpenBSDの上で直接それを行うことができるはず、メインスレッド

のための1を返します。

LinuxではTID == PIDアプローチを使用できます。

NetBSDとSolarisでは、TID == 1アプローチを使用できます。

私はこれがうまくいくことを願って、良い一日を!

+1

MacOSXは、* BSD sort ofの根強く、 'pthread_main_np()'の使用方法を説明しています。すべての* BSD上に完全に文書化されたインターフェース(マンページを持っています)です。 Solarisには 'thr_main()'と同等の機能があり、そこに '#pine_main_np thr_main'を単に定義することもできます。 'TID == 1 'トリックよりも使いやすくなりました。 –

+1

これはおそらく言うまでもありませんが、iOSの作成を計画している場合は、pthread_main_np()関数もサポートされています。 – NSDestr0yer

7

main()からpthread_self()を呼び出し、結果を記録します。 pthread_self()への今後の呼び出しを保存した値と比較して、あなたがメインスレッドにいるかどうかを知ることができます。

+1

私はこのライブラリが多くのプログラムで使用されていることを明確にするために私の質問を編集しました。それぞれに新しいコードを追加することは望ましくありません。 –

0

何らかの種類の共有名リソースを利用すると、名前を登録するためのスレッド(名前にスレッドIDのマップなど)を作成することができます。ロギングシステムは、スレッドセーフな方法でスレッドIDを介して名前を取得するメソッドに呼び出しを行うことができます。

スレッドが終了すると、メモリからの漏洩を防ぐためにスレッドの名前をマッピングから削除します。

この方法では、メインだけでなくすべてのスレッドの名前を付けることができます。

+0

私はすでにこれをすべて持っています。これは、どのスレッドがメインであるかを自動的に判断するのに役立ちません。 –

関連する問題