Io uso std::map
e per ottenere un singolo elemento che posso usare: http://www.cplusplus.com/reference/map/map/È std :: map :: end-thread-safe ed è garantito che sia sempre lo stesso per lo stesso contenitore?
iterator find (const key_type& k);
mapped_type& at (const key_type& k);
mapped_type& operator[] (const key_type& k);
anche: lower_bound()
o equal_range()
- sono le stesse find()
in questo caso .
non posso usare:
at()
- perché un'eccezione, e ho misurato 10 volte la degradazione delle prestazionioperator[]
- perché inserire un elemento, se non esiste, tale comportamento è inaccettabile
find()
- è quello che voglio. Ma io uso std::map
nel programma multi-thread e proteggerlo dal blocco std::mutex
.
Ci sono anche l'inserimento e la rimozione a std::map
dagli altri thread.
Devo proteggere std::map::end
o è garantito che sia sempre lo stesso per un contenitore allocato?
Posso usare qualcosa come questo static auto const map_it_end = map1.end();
che non è protetto da std::mutex
?
#include <iostream>
#include <string>
#include <mutex>
#include <thread>
#include <map>
std::map<std::string, std::string> map1 ({{"apple","red"},{"lemon","yellow"}});
static auto const map_it_end = map1.end();
std::mutex mtx1;
void func() {
std::lock_guard<std::mutex> lock1(mtx1);
auto it1 = map1.find("apple");
if(it1 != map_it_end) // instead of: if(it1 != map1.end())
std::cout << it1->second << ", ";
}
int main()
{
std::thread t1(func);
std::thread t2(func);
t1.join();
t2.join();
return 0;
}
http://www.cplusplus.com/reference/map/map/end/
gare dati Il contenitore si accede (né il const né le versioni non-const modificano il contenitore). Nessun elemento contenuto è accessibile dalla chiamata, ma l'iteratore restituito può essere utilizzato per accedere a o modificare elementi. L'accesso o la modifica contemporanea di diversi elementi è sicuro.
Hai provato a inserire un nuovo elemento alla fine della mappa e verificare se map :: end() è cambiato? –
Probabilmente non salverete alcuna prestazione misurabile confrontando a 'map_it_end' piuttosto che a' map1.end() '. –
La mappa cambia mai? Se non lo fa, e fai solo ricerche senza inserire o cancellare elementi, non hai bisogno di un mutex. Gli accessi contemporanei non modificabili sono thread-safe. –