Синхронизация потоков для карты C ++

Я создаю многопоточную программу на С ++ с использованием pthread (стандарт С ++ 98).У меня есть std :: map, к которой будут обращаться несколько потоков.Доступ будет заключаться в добавлении и удалении элементов с помощью поиска, а также доступ к элементам с помощью оператора [].Я понимаю, что чтение с использованием оператора [] или даже изменение элементов с его помощью является потокобезопасным, а остальные операции - нет.Первый вопрос: правильно ли я это понимаю?Некоторые потоки будут просто обращаться к элементам через [], в то время как другие будут выполнять некоторые другие операции.Очевидно, мне нужна какая-то форма синхронизации потоков.На мой взгляд, это должно работать следующим образом: - Пока для карты не выполняется никаких операций «записи», все потоки должны иметь возможность «читать» из нее одновременно.- Когда поток хочет «записать» на карту, он должен установить блокировку, чтобы ни один поток не запускал какие-либо операции «чтения» или «записи», а затем он должен ждать, пока все операции «чтения» не будут завершены, после чего онвыполнит операцию и разблокирует замки.- После снятия блокировок все потоки должны иметь возможность свободно читать.Главный вопрос: какие методы синхронизации потоков я могу использовать для достижения такого поведения?Я читал о мьютексах, условных переменных и семафорах, и, насколько я понимаю, они не будут делать то, что мне нужно.Я знаком с мьютексом, но не с cond.переменные или семафоры.Основная проблема, которую я вижу, заключается в том, что мне нужен способ блокировки потоков до тех пор, пока что-то не произойдет (операция записи не завершится) без этих потоков, а затем что-либо блокирует по очереди.Также мне нужно что-то вроде перевернутого семафора, который блокируется, когда счетчик больше 1, а затем просыпается, когда он равен 0 (т.е. операция чтения не выполняется).Заранее спасибо.PS Это мой первый пост.Пожалуйста, сообщите, если я что-то не так делаю!
7 голосов | спросил Dan 17 J0000006Europe/Moscow 2015, 13:40:55

0 ответов


Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132