giGii

cmap

Jan 14th, 2023
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.72 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <future>
  4. #include <mutex>
  5. #include <map>
  6. #include <vector>
  7.  
  8. using namespace std::string_literals;
  9.  
  10. template <typename Key, typename Value>
  11. class ConcurrentMap {
  12. public:
  13.     static_assert(std::is_integral_v<Key>, "ConcurrentMap supports only integer keys"s);
  14.  
  15.     explicit ConcurrentMap(size_t bucket_count) : buckets_(bucket_count),
  16.                                                   cm.guards_(bucket_count),
  17.                                                   cm.parts_(bucket_count)
  18.     {
  19.     }
  20.  
  21.     struct Access {
  22.         std::lock_guard<std::mutex> guard_;
  23.         Value& ref_to_value;
  24.     };
  25.  
  26.     Access operator[](const Key& key) {
  27.         // сначала! блокирую корзину, потом лезу в неё
  28.         return {std::lock_guard(cm.guards_[key % buckets_]), cm.parts_[key % buckets_][key]};
  29.     }
  30.  
  31.     std::map<Key, Value> BuildOrdinaryMap() {
  32.         std::map<Key, Value> result;
  33.         for (size_t i = 0; i < cm.parts_.size(); ++i) {
  34.             std::lock_guard<std::mutex> guard(cm.guards_[i]); // заблокировал корзину, в которой "лежит" словать
  35.             for (auto& [k, v] : cm.parts_[i]) { // забираю из корзины все, находясь под защитой guard
  36.                 result[k] = v;
  37.             }
  38.         }
  39.  
  40.         return result;
  41.     }
  42.  
  43.     void erase(Key key) {
  44.         cm.parts_[key % buckets_].erase(key);
  45.     }
  46.  
  47.  
  48. private:
  49.     struct CMap {
  50.         std::vector<std::mutex> guards_;
  51.         std::vector<std::map<Key, Value>> parts_;
  52.     };
  53.  
  54.     size_t buckets_;
  55.     CMap cm;
  56.    
  57.  
  58.  
  59.     // std::vector<std::mutex> guards_;
  60.     // std::vector<std::map<Key, Value>> parts_;
  61. };
Advertisement
Add Comment
Please, Sign In to add comment