Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
6 / 6 / 3
Регистрация: 22.09.2013
Сообщений: 166

Работа с std::map одновременно в нескольких потоках

25.10.2016, 21:41. Показов 3676. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть мапа:
C++
1
std::map<std::string, bool> map_password;
(ключ - предполагаемый пароль, значение - проверялся ли этот ключ или нет)

И есть метод, который работает с этой мапой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
inline void Brute::find_password(std::string need_pass)
{
    for (auto iter: map_password) 
    {
        if (iter.second != true) 
        {
            std::unique_lock<std::recursive_mutex> locker(critical_section);
            iter.second = true;
            if (iter.first == need_pass)
            {
                std::cout << "PASS = " << need_pass << std::endl;
                return;
            }
        }
    }
}
Этот метод работает в N потоках одновременно.
Возникла проблема: Если в методе
C++
1
inline void Brute::find_password(std::string need_pass)
срабатывает условие
C++
1
2
3
4
5
6
7
8
9
10
if (iter.second != true) 
        {
            std::unique_lock<std::recursive_mutex> locker(critical_section);
            iter.second = true;
            if (iter.first == need_pass)
            {
                std::cout << "PASS = " << need_pass << std::endl;
                return;
            }
        }
а в частности строка
C++
1
iter.second = true;
то в других потоках в iter.second будет тем что было изначально до каких либо проверок.
По моей задумке это должно работать пока-что так: проверили ключ. Если подошел, то все гуд. Если не подошел то ищем из того, что еще не проверяли. И вот как сделать по нормальному, чтобы значение мапы подхватывалось во всех работающих потоках.
Я пытался объявить мапу как:
C++
1
std::map<std::string, volatile bool>    map_password;
но результата 0.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.10.2016, 21:41
Ответы с готовыми решениями:

Insert разных таблиц в нескольких потоках (одновременно) в access
Всем привет, хочу в несколько потоков вставлять данные в разные таблицы в базе access (.mdb, .accdb) но выдает ошибку: &quot;Обновление...

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map?
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std map? Например: std::map...

Emplace в std::map. Как добавить элемент в std::map без копирования?
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa; ksa.emplace(std::piecewise_construct, ...

17
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 21:46
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
inline void Brute::find_password(const std::string& need_pass)
{
    std::unique_lock<std::recursive_mutex> locker(critical_section);
    for (auto iter: map_password) 
    {
        if (iter.second != true) 
        {
            iter.second = true;
            if (iter.first == need_pass)
            {
                std::cout << "PASS = " << need_pass << std::endl;
                return;
            }
        }
    }
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
25.10.2016, 22:00
hoggy, разве при таком подходе не теряется весь смысл многопоточности?
0
6 / 6 / 3
Регистрация: 22.09.2013
Сообщений: 166
25.10.2016, 22:01  [ТС]
Как можно заметить. Другие потоки все равно проверяют ключ, который был проверен.
Миниатюры
Работа с std::map одновременно в нескольких потоках  
0
6 / 6 / 3
Регистрация: 22.09.2013
Сообщений: 166
25.10.2016, 22:02  [ТС]
И кстати да. Получается с мапой сможет единовременно работать только один поток. Я думаю, что мъютекс стоял там где нужно...
0
56 / 56 / 31
Регистрация: 24.10.2016
Сообщений: 186
25.10.2016, 22:11
Цитата Сообщение от кверти Посмотреть сообщение
Получается с мапой сможет единовременно работать только один поток. Я думаю, что мъютекс стоял там где нужно...
А как по другому? Если нужно читать и писать в одну переменную из разных потоков, то прийдется лочить и запись, и чтение.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 22:14
Цитата Сообщение от castaway Посмотреть сообщение
разве при таком подходе не теряется весь смысл многопоточности?
профит от многопоточке потерялся уже тогда,
когда ТС захотел сделать разделяемый ресурс.

я уже молчу, что логика самой функции слегка бредовая.
нафиг вообще делать пошаговый поиск по всей мапе?
не понятно, чего хочет ТС.
0
6 / 6 / 3
Регистрация: 22.09.2013
Сообщений: 166
25.10.2016, 22:17  [ТС]
ТС хочет сделать жалкую пародию на брутфорс. Следовательно мне нужно перебирать всю мапу. Понятное дело, что нужно будет выключать потоки, когда будет найден искомый результат, но это позже... А сейчас сможете объяснить как можно выкрутиться из ситуации?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 22:23
Цитата Сообщение от кверти Посмотреть сообщение
ТС хочет сделать жалкую пародию на брутфорс.
разделяйте зоны ответственности.

например - 1 поток перебирает все на букву 'a'.
а другой - на букву 'b',
и тд.

что бы они не пересекались друг с другом.

сам перебор выполняется по какому то закону,
и нет (не должно быть причин)
что бы хранить предыдущие неудачные варианты.

каждый поток хранит свою собственную
локальную копию некоторой "текущей позиции".

например: поток запомнил код символа,
который он подставлял на предыдущей итерации,
подставляет следующий.

сами слова то запоминать зачем?
3
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
25.10.2016, 22:30
Цитата Сообщение от hoggy Посмотреть сообщение
профит от многопоточке потерялся уже тогда,
когда ТС захотел сделать разделяемый ресурс.
Так а какой он должен быть, если не разделяемый?
А подход бредовый, согласен.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 22:32
Цитата Сообщение от castaway Посмотреть сообщение
Так а какой он должен быть, если не разделяемый?
см #9

когда каждый поток работает со своим собственным набором данных,
то и лочить ничего не нужно.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
25.10.2016, 22:56
hoggy, это я прекрасно понимаю, и по сути это то же самое, разделяемый ресурс.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 23:16
Цитата Сообщение от castaway Посмотреть сообщение
по сути это то же самое, разделяемый ресурс.
не понял этого высказывания.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
25.10.2016, 23:28
Цитата Сообщение от hoggy Посмотреть сообщение
не понял этого высказывания.
Есть один последовательный набор данных из сорока элементов. Есть четыре потока. Каждый поток работает с десятью последовательными элементами, тем самым имея собственный набор данных.
Вопрос: набор данных из сорока последовательных элементов - разделяемый ресурс?
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
25.10.2016, 23:38
скорее нет, чем да. с тем же успехом разделяемым ресурсом можно назвать память, которую себе выделяют себе под задачи разные потоки. но для обращения к уже выделенным кускам памяти никакой синхронизации не надо. читай\пиши сколько влезет.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 23:54
Цитата Сообщение от castaway Посмотреть сообщение
Вопрос: набор данных из сорока последовательных элементов - разделяемый ресурс?
нет.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.10.2016, 00:06
castaway, ну так каждый поток знает и может по-пьяне обратится к любому с сорока, а hoggy хочет наверно донести, что у каждого своя локальная копия
C++
1
thread_data( std::vector<Some>(  std::begin() + 10*i, std::begin() + 10 + 10*i ))
или не говорить потоку, что это контейнер вовсе и пусть работает с некоторыми итератора
C++
1
thread_data( std::begin() + 10*i, std::begin() + 10 + 10*i );
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
26.10.2016, 00:19
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а hoggy хочет наверно донести, что у каждого своя локальная копия
Нет. Суть в том, что один большой ресурс делится на N-ресурсов поменьше, которые располагаются последовательно, и N потоков работают с каждым.
Это подойдёт не для любой задачи, но для этой подходит хорошо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.10.2016, 00:19
Помогаю со студенческими работами здесь

Подсчитать, сколько чисел содержится одновременно как в первом списке, так и во втором (используя std::map)
Даны два списка чисел, которые могут содержать до 100000 чисел каждый. Посчитайте, сколько чисел содержится одновременно как в первом...

Очистка map и перевернутого std::map c std::greater
Написала я программу, которая заполняет два контейнера map. a,b. вывод программы такой 11 a: 0.00000000 - 0.00000000 a: 0.10000000...

Std::map ключ из нескольких значений (одно из которых может быть не заполненно)
Добрый день. Есть следующий вопрос. У меня есть некие 2 транзакции, которые необходимо связать между собой. Связываю я их по id,...

Работа с Task - Недопустимая операция в нескольких потоках
Добрый день. Прошу помощи. Есть процедура в которой выполняется задача: private void button3_Click(object sender, EventArgs e) ...

Не могу разобраться как обновить в std::map<std::string, вектор_структур>
Не могу разобраться как обновить вектор структур после его добавления в map без удаления и перезаписи struct pStruct { int...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru