Параллельное обновление с использованием folly concurrentHashMap - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь 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.

...