Мне нужно поменять карту std :: map, чтобы обновить некоторую конфигурацию. Это происходит в одном потоке.Как создать C++-карту :: swap thread safe?
В другом потоке мне нужно прочитать значения из этой карты (только один потребительский поток, пока).
В продюсерский потоке, я в настоящее время (псевдо-код):
pthread_mutex lock;
std::map<int, char> current_config;
std::map<int, char> new_config;
...
<Read into new config>
ScopeLock(lock);
current_config.swap(new_config);
В потребительском потоке, я называю аксессор в продюсерском потоки, который выполняет следующие действия:
ScopeLock(lock)
return current_config;
Похоже, что это предотвратит доступ потребителя к карте во время свопинга, но мне интересно, что произойдет, если потребитель использует карту, а затем продюсеру нужно поменять карты.
Является ли эта нить безопасной?
Я полагаю, что я мог бы сделать блокировку в обоих потоках, но я старался не требовать от потребителя блокировки.
Ваш потребитель не делает никаких поисков. Похоже, что все, что он делает, возвращает ссылку или копию на карту, затем вызывающий выполняет поиск. Если это копия, то она неэффективна, но потокобезопасна. Если это ссылка, то она не является потокобезопасной (заблокированная блокировка освобождается при возврате, прежде чем вызываемый может выполнить поиск). – Adam
Блокировка не защищает что-либо, если не все доступ туда проходит. Сожалею. – Surt