Ich habe ein gemeinsames Problem (das hier in mehreren Variationen veröffentlicht wurde) eines Prozesses mit mehreren Threads, die jeweils lesen oder schreiben in eine Gruppe von gemeinsamen Variablen (für die Einfachheit - sagen wir es ist eine einzelne Variable).Design thread sichere Variable Klasse in C++
Jede Variable sollte gegen paralleles Schreiben geschützt sein und paralleles Lesen ermöglichen.
Ich habe mehrere Lösungen gesehen, und entschied sich für die folgenden ein zu konzentrieren, die Wachen (erwähnt in diesem link)
jedoch verwendet, ich konnte nicht die folgenden Grundsätze herauszufinden:
MutexGuard-Klasse: sollte nicht als Singleton implementiert werden. Andernfalls erstellt jeder Thread einen neuen Mutex, der auf einen einzelnen allgemeinen Mutex wartet.
Wenn die Klasse MutexGuard nicht singleTon ist, sollte zumindest der m_Mutex statisch sein, damit er für alle Instanzen dieser Klasse freigegeben wird.
Warum sind Funktion1 und Funktion2 als statisch definiert. Auf diese Weise kann es ohne den Kontext einer Instanz aufgerufen werden (Klasse ist nur Namespace) und der Wert von m_SharedVar fehlt möglicherweise.
Gibt es eine einfache Möglichkeit, die Implementierung für Multi-Leser/Einzelschreiber-Sperre zu ändern? sollte ich in diesem fall nur den mutex typ ändern?
class MutexGuard { MutexType & m_Mutex; public: inline MutexGuard(MutexType & mutex) : m_Mutex(mutex) { m_Mutex.lock(); }; inline ~MutexGuard() { m_Mutex.unlock(); }; } class TestClass { MutexType m_Mutex; double m_SharedVar; public: TestClass() : m_SharedVar(4.0) { } static void Function1() { MutexGuard scopedLock(m_Mutex); //lock the mutex m_SharedVar+= 2345; //mutex automatically unlocked } static void Function2() { MutexGuard scopedLock(m_Mutex); //lock the mutex m_SharedVar*= 234; throw std::runtime_error("Mutex automatically unlocked"); } }
* Jede Variable sollte gegen paralleles Schreiben geschützt sein und paralleles Lesen ermöglichen. * - seien Sie vorsichtig, solange ein Thread schreiben kann, müssen Sie gleichzeitige Lesevorgänge synchronisieren, um Datenrennen zu verhindern. –
Der Code ist inkonsistent: Wenn 'Function1' und -'2'' static' sind, können Sie nicht auf nicht-static-Membervariablen wie 'm_SharedVar' zugreifen. Sie sollten nicht "statisch" sein, es sei denn, m_SharedVar ist auch "statisch". Beginne grundsätzlich damit, darüber nachzudenken, ob deine Daten "statisch" sein sollen oder nicht (wir können es dir nicht sagen), dann mach den "Mutex", der es schützt, gleich. Bei gleichzeitigen Lesern wechseln Sie zu einer Lese-Schreibsperre (die eine neue API und Änderungen an Ihrem Code beinhaltet, um zu sagen, ob Lese- oder Schreibzugriff erforderlich ist); siehe [hier] (http://stackoverflow.com/questions/16774469/a-rw-lock-for-c11-threads). –
@TonyD, danke für die Antwort, genau das habe ich mir gedacht. Ich kopierte diese Lösung aus der Link-Erwähnung in meiner Frage, und ich fand heraus, dass es ein Problem mit der statischen Funktionsdefinition gibt. Allerdings bin ich mir immer noch nicht sicher, ob ich die Klasse Singleton machen muss oder nicht. – Zohar81