Я пытаюсь folly::concurrentHashMap
для очень простого примера.Предположим, у нас есть n
потоки, и каждый из них пытается вставить только один элемент в хэш-карту: key = 0
и val=max(map[key], threadId)
.
Пример
Запуск 3 потоков: поток 0, поток 1, поток 2 (они могут получить доступ к карте в любом порядке)
Before running threads: map.find(0) == map.end()
After thread 1 => map[0] will be 1
After thread 0 => map[0] will be 1 (i.e., max(1, 0))
After thread 2 => map[0] will be 2 (i.e., max(1, 2))
Код
folly::ConcurrentHashMap<KeyType, ValType> follyMap;
for (int i = 0; i < numThreads; i++) {
insertionThreads.emplace_back(std::thread([&] {
do {
auto found = follyMap.find(key);
if (found != follyMap.end()) {
ValType oldVal = found->second;
if (oldVal < val) {
std::cout << cnt << std::endl;
auto res = follyMap.assign_if_equal(key, oldVal, val);
cont = !res;
}
break;
} else {
auto res = follyMap.insert(key, val);
cont = !res.second;
}
} while (cont);
}
Проблема
Проблема в том, что выходявляется недетерминированным и неверным.То есть, например, для вышеупомянутого примера программа выводит 0, 1 или 2. Однако правильным значением является только 2.