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

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

Восстановить пароль Регистрация
 
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
19.11.2013, 18:14     std::unordered_map и много-поточность #1
Можно ли обращаться к объекту 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 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 и много-поточность
Еще ссылки по теме:

Hash_map unordered_map C++
C++ Доступ к элементам unordered_map
Поиск по нескольким unordered_map C++

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

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

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