2012-01-24 16 views
5

POSIXのスレッドを読みながら、スレッド固有のデータの例を紹介しました。私はスレッド固有のデータ - スレッドIDを持つ静的マップを使用できないのはなぜですか?

など、様々な初期化子、あなたはとpthread_onceを使用することでミックス特に一度、スレッド固有のデータ・インタフェースは少し不格好に見える

...私の心の中での混乱の一つの領域を持っているされました何らかの理由で私は静的なstd :: mapを使うことができません。ここで、キーはpthread_self()idで、データ値はstd :: pairの第2部分に保持されていますか?

ミューテックスでラップされている限り動作しない理由は考えられませんが、私に混乱を招くような何か提案はありません。 。私は糸通しがキャッチ22の多くを持つことができることを知っているので、私は尋ねると思っていました。スレッド固有データはロックの必要性を回避し、データ

  • を持つ他のスレッド台無しに必ずデータが洗浄されます
  • 標準ライブラリコンテナの前にスレッド固有データが存在していた:)

  • 答えて

    5

    私は、これがある限りそれは、それ自体で非常に良い理由であることをミューテックス

    に包まれたように動作しないだろうと理由を考えることはできません。適切に実装されていれば、にはを含まないスレッド固有のデータにアクセスして、他のスレッドが同時にそれらのスレッドを作成またはアクセスするのを防ぐことができます。

    std::mapを使用すると一般的な効率(一定時間アクセス、対数時間)もあり、pthread_tには適切な順序付けが定義されているという保証はなく、他のすべてのスレッドリソースとともに自動クリーンアップがあります。

    Posix APIが気に入らない場合は、C++ 11のthread_localキーワード、またはboost::thread_specific_ptrを使用できます。

    +0

    +1です.C++ 11のキーワードをありがとう、私はそれをサポートしているプロジェクトに乗って楽しむでしょう:) –

    3
    1. のpthreadスレッドが消えたときに自動的に表示されます。

    あなたが独自のソリューションを使用することを止めるものはありません。スレッドが実行される前にコンテナが完全に構築されていることを確認できれば(静的スレッドモデル)、ミューテックスは必要ありません。

    +0

    さらに、pthreadはC++ではなくC++ – nos

    関連する問題