22

ネットワークアプリケーションベースのC/Sを開発していますが、std :: mapに追加するロックが多すぎて、サーバーのパフォーマンスが低下していることがわかりました。

ロックフリーマップを実装できるかどうか疑問に思います。実装できる場合は、どのように実行しますか?そこにオープンソースコードはありますか?

編集:実際には、std :: mapを使用してソケット情報を格納し、ソケットファイルの説明に基づいてカプセル化を行い、IPアドレス、ポート、ソケットタイプ、tcpまたはudpなどの他の必要な情報を含めました。

要約すると、私たちはそれが

map<int fileDescriptor, socketInfor*> SocketsMap, 

次に、データの送信に使用されるすべてのスレッドがSocketsMapにアクセスする必要があり、SocketsMapから読み取る前またはSocketsMapに書き込む前にミューテックスを追加する必要があります。したがって、SocketsMapに追加されるロックが非常に多いため、アプリケーション全体の同時実行レベルが大幅に低下します。

同時実行レベルの問題を回避するために、2つの解決策があります。1。各socketInfor*を個別に保存します。2。ある種のロックフリーマップを使用します。

このソリューションに必要なコードの変更はソリューション1の変更よりもはるかに少ないため、ある種のロックフリーマップを見つけたいと思います。

4

6 に答える 6

20

実際には方法がありますが、私自身は実装していませんが、著名なC++の専門家であるAndreiAlexandrescuのハザードポインターを使用したロックフリーマップに関する論文があります。

于 2013-01-15T13:32:34.147 に答える
5

はい、「分割順序リスト」の概念を使用して、C ++でロックフリーの順序なしマップdocs )を実装しました。これは自動拡張コンテナであり、ABAの問題なしに64ビットCASで数百万の要素をサポートします。パフォーマンス面では、それはです(5ページを参照)。何百万ものランダムな操作で広範囲にテストされています。

于 2015-10-28T21:50:03.463 に答える
2

HashMapが適していますか?インテルスレッディングビルディングブロックを見てください。興味深い並行マップがあります。ロックフリーかどうかはわかりませんが、特にロックフリーではなく、優れたマルチスレッドパフォーマンスに関心があることを願っています。また、CityHashlibを確認することもできます

編集:

実際、TBBのハッシュマップはロックフリーではありません

于 2013-01-15T14:31:52.817 に答える
2

C ++ 11を使用している場合は、 facebook/follyのAtomicHashMapをご覧ください。

于 2014-12-24T08:45:20.160 に答える
1

楽観的な設計またはトランザクションメモリを使用してマップを実装できます。

このアプローチは、2つの操作が同時にマップをアドレス指定し、1つがマップの構造を変更する可能性が比較的低く、毎回ロックのオーバーヘッドが必要ない場合に特に効果的です。

ただし、ときどき衝突が発生し、何らかの方法で衝突が発生する必要があります(通常は、最後の安定状態にロールバックして操作を再試行します)。

ハードウェアが十分なアトミック操作をサポートしている場合(これは、コンペアアンドスワップ(CAS)を使用して簡単に実行できます) 、参照のみを変更します(マップを変更するたびに、元のマップではなく、マップのコピーで作業します。コミットする場合にのみプライマリとして設定します)。

于 2013-01-15T14:09:48.190 に答える
1

誰もそれについて言及していないことに驚いていますが、Click CliffはJavaで待機なしのハッシュマップを実装しており、C++に移植できると信じています。

于 2013-11-30T00:06:40.603 に答える