unordered_map
文字列キーとバリアント値を使用して、いくつかの設定を格納するオブジェクトがあります。私のライブラリは複数のスレッドから使用される可能性があり、読み取りが書き込みを大幅に上回る可能性が非常に高いため、「get」操作がロックフリーで「put」操作がクリティカルなコピーオンライト実装について考えました。セクション、例のように:
class Cfg {
using M = unordered_map<string,X>;
shared_ptr<const M> data;
mutex write_lock;
public:
X get(string key) {
shared_ptr<const M> cur_ver = atomic_load_explicit(&data, memory_order_acquire);
// Extract the value from the immutable *cur_ver
}
void put(string key, X value) {
lock<muted> wlock(write_lock);
// No need for the atomic load here because of the lock
shared_ptr<const M> cur_ver = data;
shared_ptr<const M> new_ver = ;// create new map with value included
// QUESTION: do I need this store to be atomic? Is it even enough?
atomic_store_explicit(&data, new_ver, memory_order_release);
}
}
取得/解放の同期がポインター値だけでなく、ポイント先のデータにも影響を与える限り、設計が機能することはかなり確信しています。ただし、私の質問は次のとおりです。
- これが機能するには、ロック内のアトミック ストアが必要ですか?
- それとも、アトミックな取得は、「解放」操作であるミューテックスのロック解除と同期しますか?