生のパケットを受信して変換してキューに入れるネットワークサービスを作成しています。変換されたパケットをキューから取り出し、いくつかのルールに基づいてハッシュマップを更新するワーカースレッドもあります。異なるワーカースレッドからのハッシュマップの同時更新を防ぐために、私はmutexを使用する必要があります。残念なことにmutexを使用するとパフォーマンスが大幅に低下します。私はこのために回避策を見つける必要があります。 EDITEDハッシュマップへの同時読み込み/書き込みのための最も速い解決策は何ですか?
: 変換されたパケットは、このSESSION_IDは、ハッシュマップキーとして使用され、を sessio_id含みます。 SESSION_IDが最初である任意の挿入前または更新を検索し、存在する場合に何SESSION_IDは、新しいエントリがSESSION_IDは、すでに私はちょうど更新が存在するそうでない場合は、が、これはまさに私がmutexロックを使用する場所ですとを追加で見つからなかっ既存の値であり、単なる値の更新に使用されるmutexロックはありません。 boost :: unordered_mapを基になるハッシュマップとしてを使用していることを知るのに役立つかもしれません。以下
は、私が使うロジックのpsudoコードです:
if hash.find(session_id) then
hash.update(value)
else
mutex.lock()
hash.insert(value)
mutex.unlock()
end
あなたの提案は何か?道による
これは私の作業環境やツールである:
コンパイラ:C++(GCC)
スレッドライブラリ:pthreadの
OS:Ubuntuの14.04
ハッシュマップから読み取る頻度、ハッシュマップを更新する頻度、取得したハッシュマップの読者の数を追加する必要があると思います。 –
@SergeiKurenkov私はいくつかの詳細を追加しました:) – sepisoad
ここではエラーが発生していると思います: 'session_idが既に存在する場合、私は既存の値を更新し、単なる値の更新にはmutexロックはありません。新しいキーを追加すると、ハッシュマップがメモリを内部で再割り当てし、別のスレッドで同時にキーにアクセスすると、必ずエラーが発生する可能性があります。 –