1

私のc++の知識の欠如を考慮して、私の意図を読んでみてください。私の貧弱な技術的な質問ではありません。

これは私のプログラムのバックボーンですhttps://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp

私はwebsocket++を使用してwebsocketサーバーを構築しています(そして、websocket ++は素晴らしいです。強くお勧めします)。ユーザーごとのデータスレッドを簡単に操作できます。実際には別のスレッドで操作する必要がないため、安全です。ただし、1つの関数スレッド(実行される可能性のある複数の反復を使用)で配列(vb、php、jsなどの弱い言語からのキャッチオール用語「配列」を使用します)に書き込めるようにしたいです。同時に)、1つ以上のスレッドで読み取ります。

例としてスタックを取り上げます。すべてのids(PRIMARYすべての記事の列)を特定の方法で並べ替え、この場合は正味の投票で並べ替えてメモリに保持したい場合は、次のような関数があると思います。それ自体boost::threadで、配列を並べ替えるためにサイトで投票が行われるたびに発生します。

ロックおよびブロックせずにこれを行うにはどうすればよいですか?別の配列が構築されている間にユーザーが古い配列から読み取ることは100%問題ありませんが、ユーザーの読み取りやスレッドの書き込みが失敗したりブロックされたりすることは絶対にありません。

ロックフリーアレイは存在しますか?そうでない場合は、一時的な配列に新しい配列を構築し、構築が完了したときにロックとブロックを行わずに実際の配列に書き込む方法はありますか?

4

2 に答える 2

4

Boost.Lockfreeを見たことがありますか?

于 2013-03-11T02:22:53.683 に答える
2

ええと、ええと。複雑。

ここを見てください (例として): RCU -- これは複数の読み取りと 1 つの書き込みについてのみです。

私の推測では、一度に複数のライターが機能することはありません。より高速な更新を可能にする、配列よりも効率的な表現を探す必要があります。バランスの取れた木はどうですか?log(n) は、目立つ方法で何かをブロックすることはありません。

ブーストについて -- スレッド同期が適切にサポートされるようになったことをうれしく思います。

もちろん、コピーを保持して更新をバッチ処理することもできます。次に、バックグラウンド プロセスが更新をマージし、結果をリーダーにコピーします。

于 2013-03-11T02:24:07.750 に答える