2010-12-11 11 views
4

私は完全に並列であり、依存関係がないので、pthreadsを使うのは当然の選択でした。残念ながら、1つの共有リソース、ログファイルがあります。pthreadsを使ってローカルストレージにアクセスする方法

いずれの場合も、ログが行単位でインターリーブされないようにするため、すべてのログ呼び出しでmutexを使用するのではなく、スレッドごとに別々のログファイルを開きます。しかし現在、コード全体には、グローバル変数ロガーがあります。

私は現在2つの解決策を持っていますが、どちらも私を幸せにしません。

  1. スレッドID:pthread_self()にハッシュを実装します。
  2. スレッド作成から呼び出すすべての関数にパラメータを渡します(非常に侵略的です)。

私は、スレッドごとにグローバル変数を持つように見えるようにするための巧妙な方法が好きです。オーバーヘッドはほとんどありません。

+0

この変数を現在どのように使用しているかのコード例を追加してください。 – Alnitak

答えて

4

各スレッドが独自のログを取得する場合は、pthread_key_createと関連する関数を使用して、スレッドごとのロガー変数を維持します。

2

良い修正:グローバル変数を使用しないでください。各スレッドに独自のログオブジェクトがあります。

クイックフィックス:ロガーのグローバル変数をロギング関数呼び出しに展開し、スレッドIDを渡すマクロに変換します。または、pthreads独自のローカルからスレッドへの格納機能を使用します(pthreadキーを参照)。

それでは、あなたが持っているとしましょう:

#define global_fd get_thread_fd() 

出来上がり:あなたは経由して起こるたびに変更することを避けることができます

log(global_fd, char* entry); 

+0

このようにすると、普通の変数であるかのように 'logger_fd'にアクセスすることができます:' #define logger_fd(*(int *)pthread_getspecific(logger_key)) ' –

4

このようなスレッドごとの変数を扱う標準的な方法があります:pthread_key_createと会社です。

gccとその拡張機能がうまくいけば、スレッドごとのストレージには__threadというキーワードがあります。

関連する問題