Безопасна ли функция find() unordered_map при работе с unordered_map через несколько потоков [дубликат] ⇐ Linux
-
Гость
Безопасна ли функция find() unordered_map при работе с unordered_map через несколько потоков [дубликат]
uint16_t GetLevel (константная строка и тег) { static auto *tagMap = new std::unordered_map(); статическийshared_timed_mutex* mtx = новыйshared_timed_mutex; std::decay::type::iterator it; { //Блокировка ReadLock(*mtx); это = tagMap-> найти (тег); } if (it == tagMap->end()) { // новый тег Блокировка InsertLock(*mtx); это = tagMap-> найти (тег); // обеспечено, что два потока выполнили вышеуказанное условие if (it == tagMap->end()) { автоматический результат = tagMap->insert({tag, 1}); если (!result.секунда) { вернуть 0; } это = результат.первый; } } вернуть его->секунду; } Если tagMap->find(tag) не заблокирован с помощью readLock ранее, когда tagMap выполняет tagMap->insert(...) в другом потоке, безопасно ли tagMap->find(tag)?
uint16_t GetLevel (константная строка и тег) { static auto *tagMap = new std::unordered_map(); статическийshared_timed_mutex* mtx = новыйshared_timed_mutex; std::decay::type::iterator it; { //Блокировка ReadLock(*mtx); это = tagMap-> найти (тег); } if (it == tagMap->end()) { // новый тег Блокировка InsertLock(*mtx); это = tagMap-> найти (тег); // обеспечено, что два потока выполнили вышеуказанное условие if (it == tagMap->end()) { автоматический результат = tagMap->insert({tag, 1}); если (!result.секунда) { вернуть 0; } это = результат.первый; } } вернуть его->секунду; } Если tagMap->find(tag) не заблокирован с помощью readLock ранее, когда tagMap выполняет tagMap->insert(...) в другом потоке, безопасно ли tagMap->find(tag)?
Мобильная версия