質問

私は人間が読める文字列に値(フィールドIDの)をマッピングするために使用するのstd ::マップを持っています。私のプログラムは、他のスレッドが開始される前に、起動時にこのマップは、一度初期化され、その後、再び変更されることはありません。今、私はすべてのスレッドにこの(かなり大きい)マップの独自のコピーを与えるが、これは明らかにメモリの非効率的な使用であり、それはプログラムの起動が遅くなります。だから私は、各スレッドにマップへのポインタを与えることを考えていたが、それはスレッド安全性の問題を提起します。

私は、次のコードを使用して、マップから読んでやっているすべての場合:

std::string name;
//here N is the field id for which I want the human readable name
unsigned field_id = N; 
std::map<unsigned,std::string>::const_iterator map_it;

// fields_p is a const std::map<unsigned, std::string>* to the map concerned.
// multiple threads will share this.
map_it = fields_p->find(field_id);
if (map_it != fields_p->end())
{
    name = map_it->second;
}
else
{
    name = "";
}

複数のスレッドからのstd ::マップの読み込みに問題がこの作品かありますでしょうか?

注:私は現在のVisual Studio 2008で働いているが、私は、これはほとんどの主要なSTLの実装アクロス仕事したいと思います。

更新:constの正しさのために編集されたコードサンプル

役に立ちましたか?

解決

これは、限り、あなたのマップは同じままで、複数のスレッドから動作します。あなたが使用マップはので、任意の検索が実際に変更されないマップで検索を行います事実上の不変です。

ここでは、関連するリンクがある: http://www.sgi.com/tech/ STL / thread_safety.htmlする

  

STLのSGI実装です   スレッドセーフのみという意味で   明瞭に同時アクセス   コンテナは安全で、かつ同時であります   読み取りは、共有コンテナへのへのアクセス   安全です。複数のスレッドがアクセスした場合   単一の容器と、少なくとも1つの   スレッドは、潜在的に、その後、書き込むことができます。   ユーザーが保証する責任があります   スレッド間の相互排他   コンテナの間にアクセスします。

あなたは彼に分類カテゴリ「同時読み取り共有コンテナへのアクセス」ます。

注:これはSGIの実装についても同様です。あなたは別の実装を使用するかどうかを確認する必要があります。代替として広く使われているように見える2つの実装のうち、版STLPortが組み込まれているスレッドの安全性私が知っているよう。でも、私は、Apacheの実装について知らない。

他のヒント

これは問題ないはずです。 あなたが文書化/読み取り専用の行動を強制したい場合は、それにconst参照を使用することができます。

あなたが(本当にひねくれた実装は木が可変宣言する可能性)だけのconstメソッドを使用しない場合でも、(原則的にマップがfindへのコールに自分自身のバランスを再調整することを選択することができる)その正確性は保証されません。しかし、これは実際にはかなり可能性は低いようです。

はい、そうです。

のstd ::セットに関する同じ質問と関連記事を参照してください。

C ++のstd ::設定スレッドセーフ

ですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top