Nehmen wir an, ich eine Klasse, die wie diese (eigentlich genau dieser Größe) aussieht:Ist ein geteilter Mutex effizienter als ein Atom einer relativ großen Struktur?
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;
};
Wie Sie sehen können, diese Thread-sicher sein sollte. Die Update-Funktion wird von jeweils einem Thread, unbekannt, aber nur einem Thread (garantiert) aufgerufen, aber der Accessor kann von mehreren Threads gleichzeitig aufgerufen werden.
Die Update-Funktion ändert alle Werte und wird sehr oft aufgerufen (ein Hundertstel pro Sekunde). Die aktuelle Implementierung wird, wie Sie sich vorstellen können, viel blockieren.
Ich überlegte, std :: atomic zu verwenden, um Sperren zu vermeiden und diesen Code möglicherweise effizienter zu machen. Ich brauche jedoch wirklich die Update-Funktion, um die Werte zusammen zu aktualisieren. Daher Ich erwäge ähnliche anstatt etwas zu tun:
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;
};
Mein gegenwärtiges Verständnis von std :: Atom ist, dass, selbst wenn dieser Code besser lesbar als die vorherigen ist (weil es nicht Sperre Erklärungen hat überall), Da die K :: Data-Struktur "groß" ist, wird std :: atomic nur mit einer normalen Mutex-Sperre implementiert (sollte also sowieso nicht schneller sein als meine ursprüngliche Implementierung).
Bin ich richtig?
Ich wusste das nicht für shared_mutex ... danke für die Info! – Klaim