Я создаю многопоточную программу C++ с использованием pthread (стандарт C++ 98).Синхронизация потоков для C++-карты
У меня есть std :: map, к которой будут обращаться несколько потоков. Доступ будет добавлять и удалять элементы, используя find, а также доступ к элементам с помощью оператора [].
Я понимаю, что чтение с использованием оператора [] или даже изменение элементов с ним является потокобезопасным, но остальные операции не являются.
Первый вопрос: правильно ли я это понял?
Некоторые потоки будут просто получать доступ к элементам через [], в то время как другие будут выполнять некоторые другие операции. Очевидно, мне нужна некоторая форма синхронизации потоков.
Способ, которым я вижу это, должен работать: - Пока на карте не выполняется операция «запись», потоки должны быть способны «читать» из нее одновременно. - Когда поток хочет «записать» на карту, он должен установить блокировку, поэтому нить не запускает какую-либо операцию «читать» или «писать», а затем она должна ждать завершения всех операций «чтения», после чего он выполнит операцию и освободит блокировки. - После того, как замки были выпущены, все потоки должны быть в состоянии читать свободно.
Главный вопрос: какие методы синхронизации потоков можно использовать для достижения такого поведения?
Я прочитал о мьютексе, условных переменных и семафорах, и, насколько я вижу, они не будут делать то, что мне нужно. Я знаком с мьютексом, но не с cond. переменных или семафоров.
Основная проблема, которую я вижу, заключается в том, что мне нужен способ блокировки потоков до тех пор, пока что-то не произойдет (операция записи заканчивается) без этих потоков, а затем блокирует все по очереди. Также мне нужно что-то вроде инвертированного семафора, который блокирует, когда счетчик больше 1, а затем просыпается, когда он равен 0 (т. Е. Операция чтения не выполняется).
Заранее спасибо.
P.S. Это мой первый пост. Просьба указать, что я делаю что-то неправильно!
Вам просто нужен мьютекс для чтения-записи? –
Вам нужен замок RW, попробуйте [этот пример.] (Http://stackoverflow.com/questions/989795/example-for-boost-shared-mutex-multiple-reads-one-write) – gbjbaanb
Прекрасный первый пост. Вы не можете использовать [C++ 11] (http://en.cppreference.com/w/cpp/thread)? Это упростит ваш код и сделает его более портативным. В зависимости от характера элементов контейнера вам могут не понадобиться более тяжелые функции потока. Возможно, достаточно примитивов [sync] (http://en.cppreference.com/w/cpp/atomic). –