Supponiamo che ho una classe che assomiglia a questo (in realtà esattamente questa dimensione):È un mutex condiviso più efficiente di un atomico di una struttura relativamente grande?
class K
{
public:
long long get_x() const; // lock m_mutex in shared/read-only mode
void update(long long w); // lock m_mutex with a unique_lock
private:
long long m_a;
long long m_b;
long long m_c;
long long m_x;
double m_flow_factor;
mutable boost::shared_mutex m_mutex;
};
Come si può vedere, questo dovrebbe essere thread-safe. La funzione di aggiornamento è chiamata da un thread alla volta, sconosciuto ma solo un thread (garantito), ma l'accessor può essere richiamato da più thread contemporaneamente.
La funzione di aggiornamento sta cambiando tutti i valori e viene chiamata molto spesso (un centinaio di volte al secondo). L'implementazione attuale, come puoi immaginare, si blocca molto.
Stavo considerando l'utilizzo di std :: atomic per evitare blocchi e potenzialmente rendere questo codice più efficiente. Tuttavia, ho davvero bisogno della funzione di aggiornamento per aggiornare insieme i valori. Di conseguenza, sto pensando di fare qualcosa di simile a questo, invece:
class K
{
public:
long long get_x() const
{ return data.load().x; }
void update(long long w)
{
auto data_now = data.load();
// ... work with data_now
data.store(data_now);
}
private:
struct Data {
long long a;
long long b;
long long c;
long long x;
double flow_factor;
};
std::atomic<Data> data;
};
mia attuale comprensione della std :: atomica è che, anche se questo codice è più leggibile rispetto alla precedente (perché non hanno le dichiarazioni di blocco ovunque), dato che la struttura di K :: Data è "grande", std :: atomic verrà implementato con un normale blocco mutex (quindi non dovrebbe essere più veloce della mia implementazione iniziale comunque).
Sono corretto?
Non lo sapevo per shared_mutex ... grazie per le informazioni! – Klaim