Многопоточность доступа к одному std :: map приведет к небезопасному поведению?

Если более одного потока обращаются к одному объекту карты, но я могу убедиться, что у любого из этих потоков не будет одинакового ключа, и доступ будет таким:

//find value by key
//if find
// erase the object or change the value
//else
// add new object of the key

Вызовет ли операция проблему с синхронизацией?

3

Решение

Да, одновременное обновление без надлежащей синхронизации может привести к сбоям, даже если ваши потоки обращаются к разным ключам: std::map основан на деревьях, деревья перебалансированы, так что вы можете вызвать запись в родительский узел узла с на первый взгляд не связанным ключом.

Более того, небезопасно выполнять доступ только для чтения одновременно с записью или поиском разблокированного + блокировка при записи: если у вас есть потоки, которые могут обновлять или удалять узлы, вы должны заблокировать все читатели, прежде чем писать.

5

Другие решения

Вы будут возникают проблемы с параллелизмом, если какой-либо из потоков вставляется в дерево. СТЛ map реализуется с использованием красно-черного дерева (или, по крайней мере, с этим я знаком — я не знаю, предписывает ли Стандарт красно-черное дерево). Красно-черные деревья могут быть перебалансированы при вставке, что приведет к всевозможным расам между нитями.

Доступ только для чтения (абсолютно нет писатели) было бы хорошо, но имейте ввиду operator[] является не только для чтения; это потенциально добавляет новый элемент. Вам нужно будет использовать find() метод, получите итератор и разыщите его самостоятельно.

2

Если документы (то есть стандарт ISO C ++ 11) не говорят о том, что они поточно-безопасны (а они нет), то все. Период. Это не потокобезопасно.

Может быть реализации std :: map, который позволил бы это, но это ни в коем случае не переносимо.

Карты часто строятся на красно-черных деревьях или других структурах данных с автоматической балансировкой, поэтому изменение структуры (например, вставка или удаление ключа) приведет к повторной балансировке.

Вы должны обернуть операции чтения и записи на карте чем-то вроде семафора мьютекса, чтобы обеспечить правильную синхронизацию.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector