Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
#1

std::unordered_map и много-поточность - C++

19.11.2013, 18:14. Просмотров 1025. Ответов 13
Метки нет (Все метки)

Можно ли обращаться к объекту std::unordered_map одновременно из разных потоков?
У меня ключ это ид потока, и когда что-то делаем то каждый поток со своим списком данных, но можно ли такое?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2013, 18:24     std::unordered_map и много-поточность #2
т.е. потоки не добавляют новые элементы в мапу и не пытаются получить доступ к более чем одному элементу мапы?
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
19.11.2013, 18:38  [ТС]     std::unordered_map и много-поточность #3
I.M., смотрите есть таблица(unordered_map) у нее ключ это ид потока, а значение это вектор
есть код которому нужны значения которые есть в векторе, и этот код может вызываться в нескольких потоках, передавая свой ид(ид потока) в таблицу поток получает вектор элементов, доступ к элементам может получить только этот поток, так как он получил их через свой ид, так же он может и вставлять новые элементы.
к примеру
C++
1
2
3
4
5
6
7
8
9
10
std::unordered_map<std::size_t, std::list<Object>> map;
 
//...
 
void addNewObject(Object const & object) {
    
   auto id = this_thread::get_id();
   map[id.hash()].push_back(object);
}
..//
Вот небольшой псевдокод, показывающий как принципе планируется использовать все это
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2013, 18:45     std::unordered_map и много-поточность #4
Получается, каждый поток может получить доступ только к одному элементу мапы. И при этом, видимо, добавлять новые элементы в мапу не будет (здесь предполагается, что мапа уже заполнена чем-то) - только в списки, хранящиеся внутри мапы
В таком случае доступ из нескольких потоков ничего не испортит
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
19.11.2013, 18:52  [ТС]     std::unordered_map и много-поточность #5
I.M., элементы могут добавлятся и удалятся

Добавлено через 1 минуту
точнее элементы в вектор и сами значения мапы
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2013, 18:52     std::unordered_map и много-поточность #6
Элементы мапы или все-таки элементы списков?
т.е. будет меняться
C++
1
std::unordered_map<std::size_t, std::list<Object>>
или только
C++
1
std::list<Object>
?
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
19.11.2013, 19:01  [ТС]     std::unordered_map и много-поточность #7
I.M.,
будет и первое и второе изменяться
смотрите в чем суть... может быть группа потоков, а потом вдруг группа изменится, что тогда? как тогда быть? я думаю добавить список активных потоков и их ид, и в зависимости от этого
std::unordered_map<std::size_t, std::list<Object>> этот обьект может добавить\удалить новую пару
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
19.11.2013, 19:03     std::unordered_map и много-поточность #8
HardMorg, Доступ для чтения синхронизировать не надо. Доступ для записи в идеале синхронизировать.
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
19.11.2013, 19:08  [ТС]     std::unordered_map и много-поточность #9
ForEveR, при записи таблица может перестроится?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2013, 19:09     std::unordered_map и много-поточность #10
Тогда да, действительно нужно синхронизировать изменение мапы. Изменение списков можно не синхронизировать
Если предполагается работа с итераторами на элементы мапы, то итераторы могут стать невалидными после расширения мапы (это значит, мапа может перестроиться при записи). С этим надо быть аккуратным
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
19.11.2013, 19:10  [ТС]     std::unordered_map и много-поточность #11
как можно тогда избежать синхронизации? это буду использовать в асинхронном сервер
ct0r
Игогошка!
 Аватар для ct0r
1682 / 608 / 41
Регистрация: 19.08.2012
Сообщений: 1,224
Завершенные тесты: 1
19.11.2013, 19:22     std::unordered_map и много-поточность #12
Можно:
1) Сделать свою thread-safe хэш-таблицу (fine-grained или lock-free).
2) Использовать thread local storage.
3) Использовать ссылки вместо итераторов.
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
19.11.2013, 19:39  [ТС]     std::unordered_map и много-поточность #13
ct0r, можно ссылки?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 20:33     std::unordered_map и много-поточность
Еще ссылки по теме:

C++1z — std::unordered_map::try_emplace — объясните работу функции C++
C++ Выборка map/unordered_map по значению
Создание вложенного unordered_map C++
Lambda expressions only available with -std=c++11 or -std=gnu++11 C++
C++ Lambda expressions only available with -std=c++11 or -std=gnu++11

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ct0r
Игогошка!
 Аватар для ct0r
1682 / 608 / 41
Регистрация: 19.08.2012
Сообщений: 1,224
Завершенные тесты: 1
19.11.2013, 20:33     std::unordered_map и много-поточность #14
Цитата Сообщение от HardMorg Посмотреть сообщение
ct0r, можно ссылки?)
Ну я ж не маг. Я не могу дать ссылки лучше, чем гугл.
Yandex
Объявления
19.11.2013, 20:33     std::unordered_map и много-поточность
Ответ Создать тему
Опции темы

Текущее время: 06:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru