24 #ifndef SYNCHRONIZED_UNORDERED_MAP2
25 #define SYNCHRONIZED_UNORDERED_MAP2
27 #include <boost/unordered_map.hpp>
28 #include <graphlab/parallel/pthread_tools.hpp>
37 template <
typename Data>
38 class synchronized_unordered_map2 {
40 typedef boost::unordered_map<size_t, Data> container;
41 typedef typename container::iterator iterator;
42 typedef typename container::const_iterator const_iterator;
44 typedef std::pair<bool, Data*> datapointer;
45 typedef std::pair<bool, const Data*> const_datapointer;
46 typedef Data value_type;
47 typedef size_t key_type;
50 std::vector<container> data;
51 std::vector<rwlock> lock;
54 synchronized_unordered_map2(
size_t numblocks):data(numblocks),
57 for (
size_t i = 0;i < numblocks; ++i) {
58 data[i].max_load_factor(1.0);
62 std::pair<bool, Data*> find(
size_t key) {
63 size_t b = key % nblocks;
64 iterator iter = data[b].find(key);
65 std::pair<bool, Data*> ret = std::make_pair(iter != data[b].end(), &(iter->second));
73 std::pair<bool, const Data*> find(
size_t key)
const {
74 size_t b = key % nblocks;
75 const_iterator iter = data[b].find(key);
76 std::pair<bool, const Data*> ret = std::make_pair(iter != data[b].end(), &(iter->second));
81 void erase(
size_t key) {
82 size_t b = key % nblocks;
86 template<
typename Predicate>
87 void erase_if(
size_t key, Predicate pred) {
88 size_t b = key % nblocks;
89 iterator iter = data[b].find(key);
91 if (iter != data[b].end() && pred(iter->second)) data[b].erase(key);
94 value_type& insert(
size_t key,
const value_type &val) {
95 size_t b = key % nblocks;
97 value_type& ret = data[b][key];
101 void read_critical_section(
size_t key) {
102 size_t b = key % nblocks;
105 void write_critical_section(
size_t key) {
106 size_t b = key % nblocks;
109 void release_critical_section(
size_t key) {
110 size_t b = key % nblocks;
118 std::pair<bool, Data*> insert_with_failure_detect(
size_t key,
const value_type &val) {
119 std::pair<bool, Data*> ret ;
121 size_t b = key % nblocks;
123 iterator iter = data[b].find(key);
125 if (iter == data[b].end()) {
127 ret = std::make_pair(
true, &(data[b].find(key)->second));
130 ret = std::make_pair(
false, &(iter->second));
136 for (
size_t i = 0;i < data.size(); ++i) {