24 #ifndef GRAPHLAB_SYNCHRONIZED_UNORDERED_MAP
25 #define GRAPHLAB_SYNCHRONIZED_UNORDERED_MAP
27 #include <boost/unordered_map.hpp>
28 #include <graphlab/parallel/pthread_tools.hpp>
33 template <
typename Data>
34 class synchronized_unordered_map {
36 typedef boost::unordered_map<size_t, Data> container;
37 typedef typename container::iterator iterator;
38 typedef typename container::const_iterator const_iterator;
40 typedef std::pair<bool, Data*> datapointer;
41 typedef std::pair<bool, const Data*> const_datapointer;
42 typedef Data value_type;
43 typedef size_t key_type;
46 std::vector<container> data;
47 std::vector<rwlock> lock;
50 synchronized_unordered_map(
size_t numblocks):data(numblocks),
53 for (
size_t i = 0;i < numblocks; ++i) {
54 data[i].max_load_factor(1.0);
58 std::pair<bool, Data*> find(
size_t key) {
59 size_t b = key % nblocks;
61 iterator iter = data[b].find(key);
62 std::pair<bool, Data*> ret = std::make_pair(iter != data[b].end(), &(iter->second));
71 std::pair<bool, const Data*> find(
size_t key)
const {
72 size_t b = key % nblocks;
74 const_iterator iter = data[b].find(key);
75 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;
88 template<
typename Predicate>
89 void erase_if(
size_t key, Predicate pred) {
90 size_t b = key % nblocks;
92 iterator iter = data[b].find(key);
94 if (iter != data[b].end() && pred(iter->second)) data[b].erase(key);
98 value_type& insert(
size_t key,
const value_type &val) {
99 size_t b = key % nblocks;
102 value_type& ret = data[b][key];
112 std::pair<bool, Data*> insert_with_failure_detect(
size_t key,
const value_type &val) {
113 std::pair<bool, Data*> ret ;
115 size_t b = key % nblocks;
118 iterator iter = data[b].find(key);
120 if (iter == data[b].end()) {
122 ret = std::make_pair(
true, &(data[b].find(key)->second));
125 ret = std::make_pair(
false, &(iter->second));
132 for (
size_t i = 0;i < data.size(); ++i) {