Frage

Ein paar Monate zurück, hatte stoße ich auf diesem interessantes Szenario von einem Mann gefragt (auf orkut). Obwohl, ich habe kommen mit einer „nicht-portable“ Lösung für dieses Problem (hat es mit kleinem Code getestet), würde aber immer noch wissen, was euch zu sagen habt und vorschlagen.

Nehmen wir an, habe ich eine DLL, einige Funktionalitäten zu exportieren, in C ++ geschrieben, für Single-Threaded-Client . Diese DLL erklärt viele globale Variablen, einige vielleicht konstante Variablen (read-only) und andere sind veränderbar.

Wie auch immer, später die Dinge geändert, und jetzt will ich die gleiche DLL Arbeit mit Multi-Threaded-Anwendung (ohne die DLL zu ändern); das bedeutet, Zugriff auf mehrere Threads, die Funktionen und globale Variablen aus der DLL, und ändern Sie sie .. und so weiter. Alle diese können globale Variablen führen zu inkonsistenten Werten halten.

Die Frage ist also,

Können wir etwas tun, in dem Client-Code Multi-Access der DLL zu verhindern, und zugleich, um sicherzustellen, dass jeder Thread läuft in einem eigenen Kontext ist (was bedeutet, wenn es Zugang erhält zu die DLL, sind die DLL globalen Werte so, wie es vorher war)?

War es hilfreich?

Lösung

  

Können wir etwas tun, in dem Client-Code Multi-Access der DLL zu verhindern und zugleich sicherzustellen, dass jeder Faden läuft in einem eigenen Kontext (das heißt, wenn sie Zugriff auf die DLL wird, die globalen Werte DLL gleich sind, wie es vorher) war?

Dies ist der schwierige Teil. Ich denke, der einzige Weg, oben tun dies wäre ein Wrapper um teh bestehenden DLL zu erstellen. Wenn es aufgerufen wird, würde es den Staat (globale Variablen) für den aktuellen Thread wiederherzustellen, und sie speichern, wenn der Anruf an die DLL zurückkehrt. Sie müßten alle Zustandsvariablen in der DLL kennen und in der Lage sein, sie zu lesen / schreiben.

Wenn die Leistung ist kein Problem, eine einzelne Sperre für die gesamte DLL würde genügen, und die einfachste korrekt zu implementieren. Das würde sicherstellen, dass nur ein Thread wurde Zugriff (Lesen oder Schreiben), um die DLL auf einmal.

Andere Tipps

Sicher, man kann immer eine Wrapper-Schicht Umgang mit Multi-Threading-spezifischen Aufgaben wie Verriegelung erstellen. Man könnte sogar so in einem zweiten DLL zu tun, dass Links mit dem Original, und dann mit dem neuen DLL den endgültigen Projekt Link haben.

Beachten Sie, dass, egal wie man es umsetzen, wird dies keine leichte Aufgabe sein. Sie müssen genau wissen, welche Gewinde der Lage ist, die Wert zu welchem ??Zeitpunkt zu ändern, die in der Lage ist zu lesen, was und wann usw., es sei denn Sie wollen Probleme wie Deadlocks oder Rennbedingungen ausgeführt werden.

Wenn Sie Lösung erlaubt es, ist es oft am besten, einen einzelnen Thread zuzuordnen alle Daten zu ändern und alle anderen haben nur gelesen und nie schreiben, da gleichzeitige Lesezugriff ist immer einfacher als Zugang gleichzeitige Schreiben zu implementieren ( Erhöhung alle grundlegenden Funktionen bietet zum Beispiel so zu tun, shared_mutex ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top