1

環境 : Windows 7.0 , C++ , マルチスレッド

ソケットでデータを受信し、それを静的multimapインスタンスに追加する新しいワーカー スレッドを作成しました。

コードスニペット:

//remember mymultimap is static data type
static std::multimap<string,string> mymultimap;
EnterCriticalSection(&m_criticalsection);
mymultimap.insert ( "aaa", "bbb") );
LeaveCriticalSection(&m_criticalsection);

同時に、私のメインスレッドは同じ静的マルチマップを読んでいます:コードスナップ:

EnterCriticalSection(&m_criticalsection);
std::multimap<string,string>::iterator it = mymultimap.begin();
for( ; it != mymultimap.end(); it++)
{
std::string firstName = (*it).first;
std::string secondName = (*it).second;
}
LeaveCriticalSection(&m_criticalsection);

メイン スレッドとワーク スレッドが継続的に読み取りと書き込みを行っているため、アプリケーションのパフォーマンスが妨げられています。また、 のインスタンスにmultimapは巨大なデータ (10,000 レコード以上) が含まれています。

マルチマップで最小限の時間スレッドロックを作成するにはどうすればよいですか?

EnterCriticalSection(&m_criticalsection);
///minimal lock time for Map ???
LeaveCriticalSection(&m_criticalsection);

アプリケーションのパフォーマンスを改善するために私を助けてください。

4

1 に答える 1

1

現状では、あなたの質問は議論の余地が多すぎます。マルチマップに保存されている値が実際にどのように使用されているかはわかりません。

もしも:

  • そのデータ構造で適用される順序は重要です。
  • 読み取られた後でも、マルチマップの値を保持する必要があります。
  • 読むたびにすべてのエントリを確認する必要があります。

そうすると、その構造の使用を最適化する方法について、かなり行き詰まります。

一方、これらの要件の1つをなんとかして緩和できる場合は、たとえば、両方のスレッド間の通信に直接マップの代わりにメッセージキューを使用することで、状況を少し最適化できる可能性があります。

メッセージキューは、スレッド間の効率的な通信を実装するための標準的な方法であり、1対1のセットアップでは、ロックレスソリューションもあります。

更新:それについて考えて、スレッド間でそのタイプの構造を共有することは、それをどのように使用するかにかかわらず、良い考えではありません。マルチマップへのすべてのアクセスを1つの単一スレッド内で再グループ化することをお勧めします。これにより、他のスレッドによって生成されたアイテムが、キューを介してそれを管理するスレッドに渡されます。これにより、アイテムの保管と使用からアイテムを生成する作業が完全に切り離されます。あなたの場合、プロデューサースレッドはデータの保存にかかる時間が少なくなり、ソケットストリームを処理するための時間が長くなります。

したがって、そのソリューションでは、たとえば、初期化時に両方のスレッドで処理されるか、またはそのような静的インスタンスで処理される必要がqueue<std::pair<key,value> >ありstd::queueますmultimap。次にmultimap::insert、最初のスレッドのをaにqueue::push_back置き換えるだけmake_pair(key, value)で、コンシューマスレッドでは対称的に、fisrtはpop_frontキューに保留中のすべてのペアを持ち、それらを同時にマップに挿入してから、マップの処理を実装します。それが何であれ。

ノート:

マルチマップを使用している場合、同じキーに対して複数の値が返される可能性があることに注意してください。を呼び出すとfindイテレータが返され、マルチマップの次のエントリをチェックして、すべてを取得する必要がある場合があります。同じキーを持つ値。

于 2013-02-27T13:18:16.260 に答える