Pseudocode:
Function1_vector_copy () {
vectora = vectorb;
}
Function2_vector_search() {
find k in vectora;
}
プログラムはマルチスレッドです。多くのスレッドが を検索する可能性がありますが、ベクトルのコピーは単一のスレッドによってのみ行われますが、時折行われます。問題は何であれ、vector_search は失敗しないはずです。vector_copy は延期できますが、vector_search は延期しないでください。遅延も障害パターンもありません。問題は、 vector_search がまったく失敗しないように、永続的でなければならない共有変数 vectora です。これを達成するための最適な方法は何ですか?
編集 :
boost::shared_mutex _access;
Function1_vector_copy() {
// get upgradable access
boost::upgrade_lock lock(_access);
// get exclusive access
boost::upgrade_to_unique_lock uniqueLock(lock);
// now we have exclusive access
vectora.swap(vectorb);
}
Function2_vector_search() {
// get shared access
boost::shared_lock lock(_access);
// now we have shared access
find k in vectora ;
}
アップグレード可能な所有権を持つスレッドがアップグレードを試み、他のスレッドが所有権を共有している場合、その試みは失敗し、排他的な所有権を取得できるまでスレッドはブロックされます。 --boost-ドキュメンテーション
秘訣は、ベクターのコピーが非同期で行われ、排他的な所有権が取得された後に行われることです。したがって、ベクターコピーは最終的に発生しますが延期され、実際にベクターコピーも失敗しない操作ですが遅延します。これは私にとっては問題ありません。何らかの形で同期のためにロックがかかり、少なくとも 1 ミリ秒はブロックされます。しかし、このスワップを使用する利点は、時間の短縮につながり、無視できるようになります。