std::map
a をラップしてスレッドセーフにする実装をどこで見つけることができるか知っている人はいますか? スレッド セーフとは、一度に 1 つのスレッドで、マップへのシリアル アクセスのみを提供することを意味します。最適には、このマップは標準ライブラリおよび/またはブースト構造のみを使用する必要があります。
8 に答える
指定した基準を満たしていませんが、TBBコンテナーを確認できます。concurrent_hash_map
複数のスレッドがマップ内のデータに同時にアクセスできるようにする、いわゆるものがあります。いくつかの詳細がありますが、すべてが適切に文書化されており、「並行コンテナー」のアイデアを得ることができます。ニーズによっては、これはまったく不適切かもしれません...
ブースト shared_mutex は、制約が与えられた標準マップをラップするための最良の複数リーダー/単一ライター アプローチを提供します。タスクは一般的に簡単なので、これら2つを結合する「事前構築済み」の実装は知りません。
コレクション クラスがスレッド セーフを提供することは、一般的にはお勧めできません。コレクションを使用する上位レベルの構造に独自のロック機構を実装することで、はるかに優れたサービスが提供されます。
このライブラリを試す
http://www.codeproject.com/KB/threads/lwsync.aspx
これは、最新の C++ ポリシー ベースのアプローチで実装されています。
これは、「ベクトル」ケースのアイデアを示すリンクからのカットです
typedef lwsync::critical_resource<std::vector<int> > sync_vector_t;
sync_vector_t vec;
// some thread:
{
// Critical resource can be naturally used with STL containers.
sync_vector_t::const_accessor vec_access = vec.const_access();
for(std::vector<int>::const_iterator where = vec_access->begin();
where != vec_access->end();
++where;
)
std::cout << *where << std::endl;
}
sync_vector_t::accessor some_vector_action()
{
sync_vector_t::accessor vec_access = vec.access();
vec_access->push_back(10);
return vec_access;
// Access is escalated from within a some_vector_action() scope
// So that one can make some other action with vector before it becomes
// unlocked.
}
{
sync_vector_t::accessor vec_access = some_vector_action();
vec_access->push_back(20);
// Elements 10 and 20 will be placed in vector sequentially.
// Any other action with vector cannot be processed between those two
// push_back's.
}
Thread Safe Template Libraryを見るかもしれません
STL
効率的な (ゼロ コストの) スレッド セーフなアクセスのためにオブジェクト (コンテナーを含む) をラップする提案があります (私による - 恥知らずなプラグ) 。
https://github.com/isocpp/CppCoreGuidelines/issues/924
基本的な考え方はとてもシンプルです。読み取り/書き込みロックを強制し、同時に、ラップされたオブジェクトの const (読み取り専用の場合) または非 const (読み取り/書き込みの場合) ビューのいずれかを提示するために使用されるラッパー クラスがいくつかあります。
アイデアは、スレッド間で共有されるリソースに不適切にアクセスすることをコンパイル時に不可能にすることです。
実装コードは次の場所にあります。
https://github.com/galik/GSL/blob/lockable-objects/include/gsl/gsl_lockable
これは、実装するアプリケーション次第です。「スレッドセーフ」マップは、マップへの個々の呼び出しをスレッドセーフにしますが、多くの操作は呼び出し間でスレッドセーフにする必要があります。マップを使用するアプリケーションは、ミューテックスをマップに関連付け、そのミューテックスを使用してマップへのアクセスを調整する必要があります。
スレッドセーフなコンテナーを作ろうとするのは Java では間違いであり、C++ でも間違いです。