私は、共有データ構造 (an std::map
) が複数のスレッドから読み取られ、更新されるアプリケーションに取り組んでいます。マップ内の要素の数は初期化時に固定されるため、値は頻繁に変更されますが、キーは変更されません。アクセスを保護するために、どちらも Boost によって提供されるミューテックスとスコープ付きロックを使用します。
std::map<Key,Value> dataMap;
boost::mutex m;
void Set(Key k, Value v) {
boost::scoped_lock sl(m);
dataMap[k] = Value;
}
Value Get(Key k) {
boost::scoped_lock sl(m);
return dataMap[k];
}
マップへのアクセスがボトルネックかどうかを判断するにはどうすればよいですか? それぞれの場合にミューテックスを取得するのにかかる時間を計ることは、私には理にかなっているように思えます。
void Set(Key k, Value v) {
Timer t; t.Start();
boost::scoped_lock sl(m);
t.Stop();
cout << "Time taken to acquire mutex: " << t.Elapsed() << endl;
dataMap[k] = Value;
}
競合が少ない場合、平均所要時間は低く、競合が増加すると (たとえば、多数のスレッドがある場合)、平均所要時間は大幅に増加すると予想されます。
これは、ミューテックスへのアクセスがボトルネックになっているかどうかを診断する有効な方法ですか?
そうでない場合、同様の機能を正しく実行するオープンソース プログラムはありますか?