2 Stimmen

Sollte ich Mutex ODER Critical Section für Windows Mobile RIL verwenden?

Ich verwende Native APIs der Funkschichtschnittstelle (RIL) en Windows Mobile-Anwendung . In dieser API werden die Rückgabewerte/Ergebnisse der meisten Funktionen nicht sofort zurückgegeben, sondern über eine Callback-Funktion, die an die RIL-API weitergegeben wird.

Einige Anwendungsbeispiele finden Sie unter XDA-Entwicklungswerkzeuge y Google Zahnräder Geolokalisierung API .

Meine Frage ist, in diesen beiden Beispielen wird ein Mutex verwendet, um die Daten anstelle von anderen Synchronisationsobjekten zu schützen.

Wird der Kritische Abschnitt in den von den beiden Beispielen beschriebenen Anwendungsfällen gut funktionieren? Welcher Thread oder Prozess wird die Callback-Funktionen tatsächlich aufrufen?

Bearbeiten:
Meine Daten werden von meinen Codes nur innerhalb meines Prozesses abgerufen, aber welcher Thread/Prozess ruft die Callback-Funktionen in der RIL-API auf? Ich meine, ich habe eine Callback-Funktion an die RIL-API übergeben, aber werden die Callbacks von einem anderen Prozess aufgerufen? In diesem Fall gibt es eine weitere Erklärung, warum die Beispiele Mutex verwenden. Wenn die RIL-API tatsächlich einen Thread innerhalb meines Prozesses erstellt und meine Callback-Funktionen aufruft, dann denke ich, dass Critical Section in Ordnung wäre (und es ist schneller als ein Mutex).

Aktualisierung:
Ich habe Daten, die (1) meine Codes aus meinem eigenen Prozess abgerufen werden und ist auch (2) aus einem Funktionsrückruf geändert. Der Rückruf erfolgt über die RIL-API.

Meine Frage: Welcher Thread/Prozess ruft die Callback-Funktionen in der RIL-API auf?

Die Geschichte bis jetzt:
Ich: Hallo Herr RIL, bitte geben Sie einige Daten in mein Büro ein (z.B. in Form von Variablen).
RIL: Okay, Sir. Ich werde die Daten später eingeben und Ihnen ein Signal geben, wenn es fertig ist (ich habe hier ein Ereignis verwendet).

Für den Zugang zu meinem Büro ist eine Zugangskarte erforderlich. Wenn Herr RIL aus demselben Unternehmen wie ich kommt, kann er seine eigene Zugangskarte benutzen, um mein Büro zu betreten (in meinem Fall ist es ein kritischer Bereich). Wenn er von einem anderen Unternehmen kommt, muss ich eine Zugangskarte/Besucherkarte für ihn einrichten (in meinem Fall benötige ich hier einen Mutex).

Wenn Herr RIL seine eigene Zugangskarte verwendet, brauche ich keine Zugangskarte/Besucherkarte für ihn einzurichten, was für mich weniger Ärger bedeutet. (d.h. Critical Section ist schneller als ein Mutex)

Das Problem ist, dass ich diesen Herrn RIL erst vor ein paar Tagen getroffen habe und nicht viel über ihn weiß. Ich weiß nicht, ob er zum selben Unternehmen gehört wie ich. Eine Option als erwähnt von nobugz ist es, eine Zugangskarte für Herrn RIL einzurichten, unabhängig davon, ob Herr RIL demselben Unternehmen angehört wie ich. Auf diese Weise ist gewährleistet, dass Herr RIL mein Büro betreten kann. (meine Daten/Variablen sind garantiert sicher)

Im Moment verwende ich Mutex in meinem Code (Einrichtung einer möglicherweise redundanten Zugangskarte für Herrn RIL).

Aha! Beim Schreiben dieser Zeilen kam mir gerade eine Idee. Ich denke, ich werde Herrn RIL einfach fragen, von welchem Unternehmen er ist. Auf diese Weise muss ich in Zukunft keine Zugangskarte für ihn einrichten, wenn sich herausstellt, dass er in derselben Firma wie ich arbeitet (d.h. GetCurrentProcessId() y GetCurrentThreadId() in der Rückruffunktion)

2voto

Jeremy O'Donoghue Punkte 816

Die Windows Mobile RIL befindet sich normalerweise in device.exe (für WM6.x). Wenn Ihr Prozess jedoch die RIL aufruft, geht Ihr Aufruf über den RIL-Proxy.

Der RIL-Proxy ist mit Ihrem Prozess verknüpft und befindet sich in diesem. Er kümmert sich für Sie um alle Probleme, die mit Prozessgrenzen verbunden sind (nebenbei bemerkt ist dies zumindest ein Teil des Grundes, warum alle RIL-Datenstrukturen in einen einzigen Speicherblock mit bekannter Größe gepackt werden müssen). Intern erstellt der RIL-Proxy einen Thread, auf dem Ihr Callback ausgeführt wird.

Das bedeutet, dass Ihr Code ein CRITICAL_SECTION-Objekt verwenden kann, um die notwendige Synchronisierung/Schutz zu gewährleisten.

0 Stimmen

Großartige Antwort! Auf diese Art von Antwort habe ich gewartet.

1voto

Hans Passant Punkte 894572

Der Sinn der Verwendung des Mutex ist, dass Sie nicht wissen, welcher Thread den Rückruf tätigen könnte. Ja, ein kritischer Abschnitt würde auch funktionieren. Vorsicht, wenn man es falsch macht, führt das zu zufälligen und muy schwer zu diagnostizierende Fehler.

1voto

Jerry Coffin Punkte 452852

Ein kritischer Abschnitt ist ein Mutex. Ein kritischer Abschnitt unterscheidet sich von einem normalen Mutex (zumindest in erster Linie) in einer Hinsicht: Er ist spezifisch für einen Prozess, während ein Mutex prozessübergreifend verwendet werden kann.

In diesem Fall stellt sich also die Frage, was genau Sie schützen wollen. Wenn es sich um die Daten innerhalb Ihres Programms handelt, auf die kein anderer Prozess zugreifen kann, sollte ein kritischer Abschnitt die Aufgabe erfüllen. Wenn Sie etwas schützen, das von den beiden Prozessen gemeinsam genutzt wird, wenn der Benutzer zwei Instanzen Ihres Programms gleichzeitig ausführt, dann brauchen Sie wahrscheinlich einen Mutex.

Edit: Soweit es darum geht, einen kritischen Abschnitt zu verwenden, um das zu schützen, was RIL selbst tut, nein, das ist nicht (oder zumindest definitiv sollte nicht ) erforderlich sein. Bei einem Mutex verlassen Sie sich darauf, dass alle Prozesse zusammenarbeiten, indem sie einen Mutex mit demselben Namen öffnen, um den Zugriff auf die gemeinsam genutzte(n) Ressource(n) zu kontrollieren. Darauf kann man sich nicht verlassen, so dass die Schnittstelle, wenn sie gebraucht wird, völlig kaputt ist.

Aktualisierung: Sofern sie nicht etwas wirklich Ungewöhnliches in RIL tun, wird der Rückruf innerhalb Ihres Prozesses erfolgen, so dass ein kritischer Wert ausreichend sein sollte. Wenn er Ihre Daten modifiziert, bedeutet das, dass Ihre Daten gemappt und für den Code sichtbar sind - was bedeutet, dass die Daten in den Daten im kritischen Abschnitt ebenfalls gemappt und sichtbar sind, und es wird funktionieren. Ein kritischer Abschnitt funktioniert nur dann nicht, wenn es sich um getrennte Prozesse handelt, so dass die Daten in einem Prozess für den anderen nicht sichtbar sind.

0voto

Alienfluid Punkte 326

Nun, ein weiterer Unterschied zwischen einem Mutex und einem kritischen Abschnitt (Windows-Implementierungen, natürlich) ist, dass ein kritischer Abschnitt reentrant ist - d.h. derselbe Thread kann den kritischen Abschnitt zweimal erwerben, ohne ihn freigeben zu müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X