Übersetzen Sie

Translate to EnglishÜbersetzen Sie zum Deutsch/GermanΜεταφράστε στα ελληνικά/GreekПереведите к русскому/RussianOversetter til Norsk/NorwegianÖversätta till Svensk/Swedishहिन्दी अनुवाद करने के लिए/Hindi
Tradueix al català/CatalanTulkot uz latviešu/LatvianPreložiť do slovenčiny/SlovakVertaal aan het Nederlands/Dutchترجمة الى العربية/ArabicTraduzca al Español/SpanishTraduisez au Français/French
Traduca ad Italiano/ItalianTraduza ao Português/Portuguese日本語に翻訳しなさい /Japanese한국어에게 번역하십시오/Korean中文翻译/Chinese Simplified中文翻译/Chinese TraditionalПереклад на українську/Ukrainian
Bild der androiden drahtlosen Anwendungsentwicklung
Bild von XSLT 2.0 und XPath 2.0 von Hinweis des Programmierers (Programmierer zum Programmierer)
Bild der vorgerückten Programmierung in der UNIX-Umwelt, zweite Ausgabe (Wesley-Fachmann-rechnenreihen)
Bild der modernen Betriebssysteme (3. Ausgabe)

Tragendes WaitForSingleObject zum Linux - Teil 2

In meinem letzten Pfosten besprach ich den Gebrauch WaitForSingleObject in Beziehung zu mutexes und möglichen Weisen, gleichwertige Funktionalität einzuführen, als, solchen Code zu GNU/Linux tragend.  In diesem Pfosten beschreibe ich den Gebrauch von dieser API mit Ereignisgegenständen in Microsoft Windows und schlage mögliche Weisen der Aufgabe solchen Codes GNU/Linux oder Unix vor.

Zuerst etwas Hintergrund auf Ereignisgegenständen.  Ein Ereignisgegenstand ist gerade eine andere Art Windows-Kernfahrdienstleitergegenstand.  Von einer prespective Kodierung, ist ein Ereignisgegenstand ein Synchrounisierungsgegenstand, der eine oder mehrere Kernfahrdienstleitergegenstände einkapselt und deren Synchrounisierungssemantik über WaitForSingleObject und seine Vetter zugänglich sind.  Jederzeit nonsignaled ein Synchrounisierungsgegenstand wird entweder oder signalisiert, d.h. kann der Gegenstand in einem von zwei möglichen Zuständen nur sein.

Alle WaitFor Familie von API einschließlich WaitForSingleobject Wartezeit auf einem Gegenstandhandgriff oder Handgriffe bis einige spezifizierte Kriterien wird getroffen.  Die zwei grundlegenden Kriterien für alle diese API sind der signalisierte Zustand des Gegenstandes, auf dessen Handgriff er wartet und ein Zeitüberschreitungswert.  So ist ein Gewinde, das diese API-Wartezeiten benennt, bis der spezifizierte Gegenstand den signalisierten Zustand oder die spezifizierte Abschaltung einträgt, abgelaufen.  Wenig oder keine Zentraleinheitszeit wird verwendet, wenn solch ein Gewinde im Wartezustand ist.

Im Falle der Ereignisse bringt ein CreateEvent oder ein OpenEvent einen Handgriff zu einem Ereignisgegenstand zurück.  Wenn ein Ereignis im signalisierten Zustand ist, bedeutet es, dass das das Ereignis die Kapazität hat, eine oder mehrere Gewinde freizugeben, die dieses bestimmte signalisiert zu werden warten Ereignis.  Wenn ein Ereignis im nonsignaled Zustand ist, gibt es kein Wartegewinde frei.  Zuerst nonsignaled der Zustand eines Ereignisses.  Ein Objekt-Status Ereigniswird ausdrücklich auf signalisiert durch SetEvent oder PulseEvent eingestellt.  Ereignisgegenstände werden auch in überschnittenen Betrieben wie Ablesen von einer Einfaßung benutzt, in diesem Fall der EreignisObjekt-Status auf signalisiert durch den Kern eher als durch eine Anwendung eingestellt wird.

Ereignisse kommen auch in zwei zurückgestellte Arten.  Wenn ein Ereignis ein Manuellzurückstellen Ereignis ist, dann alle WaitForSingleObjects Rückkehr, das dieses Ereignis warten, wenn es so zusammengebaut wird.  Mit anderen Worten kann ein Manuellzurückstellen Ereignis Tätigkeit durch eine oder mehrere auslösen WaitForSingleObject oder seine Vetter.  Ein Objekt-Status Manuellzurückstellen Ereignis-muss zu nonsignaled von ResetEvent ausdrücklich zurückgestellt werden.

Für einen Auto-resetereignisgegenstand sind WaitForSingleObject und es die Relationen, die dem Zustand zurückgestellt werden

Tragendes WaitForSingleObject zum Linux - Teil 1

Vor kurzem wurde ich miteinbezogen, wenn man eine 32-Bitanwendung trug, die zuerst für Microsoft Windows NT zu GNU/Linux geschrieben wurde.  Diese Anwendung enthielt viele Anrufe zu NtWaitForSingleObject und eine kleinere Anzahl von Anrufen zu NtWaitForMultipleObject. 

Jetzt jedes, das den Code hat tragen gemusst, der mehr als einige Fälle dieser bestimmten API Win32 enthält oder ihre nahen Vetter WaitForSingleObjectEx, MsgWaitForMultipleObjects, MsgWaitForMultipleObjectsEx, etc. zu Unix oder GNU/Linux ist vermutlich mit der Erinnerung der langen eifrigen Tage und der Nächte der Probe- und Störungskodierung bereits schaudernd, die Semantik und die Funktionalität dieser bestimmten Microsoft Windows-spezifischen API zu versuchen und richtig nachzuahmen, aber für den Leser, der nicht noch hat versuchen gemusst, solch eine Anwendung, diesen Pfosten und meinen folgenden Pfosten zu tragen, kann Ihnen außer Ihrer Vernunft (und vielleicht Ihrem Haar helfen!) einmal zukünftig.

Übrigens werden beide API missbilligten in MSDN durch Microsoft aber arbeiten noch wie erwartet in Windows NT und in Windows Xp markiert.  Ich bin nicht über Windows Vista oder Windows 7 sicher, da ich sie nicht auf diesen Betriebssystemen geprüft habe.  Die zwei missbilligten API sind durch die gleichwertigen API WaitForSingleObject und WaitForMultipleObject beziehungsweise ersetzt worden.  Für den Rest dieses Pfostens bespreche ich gerade die Wiedereinbau API, aber die meisten, was ich sage, seien Sie entweder für missbilligt oder den Wiedereinbau API gültig.

Auf erster Prüfung scheint WaitForSingleObject ziemlich gutartig.  Die Beschreibung in MSDN gibt an, dass „diese Funktion zurückgeht, wenn der spezifizierte Gegenstand im signalisierten Zustand ist, oder wenn der TIMEOUTabstand abläuft“.  Klingt wie eine ziemlich einfache und harmlose API, Recht?  Möglicherweise etwas ähnlich dem POSIX.1 API pthread_cond_timedwait.  Gut sind Sie absolut falsch und dieser Pfosten und das folgende erklären warum.

WaitForSingleObject und seine Vetter können ein Signal von irgendwelchen warten, oder alles Folgen „wendet“ ein: ändern Sie Mitteilung, Konsoleneingang, Ereignis, Job, Gedächtnishilfsmittelmitteilung, mutex, Prozess, Semaphor, Gewinde und waitable Timer und unter begrenzten Umständen auf Akten und Akte Input/Output.  Wenn es passend signalisiert wird, wird ein Gewinde entblockt und fortfährt.  Keine erschienene standardisierte API in der GNU/Linux oder Unix-Welt kommt gekommen zur Behandlung dieser Strecke der Gegenstände in einer einzelnen API.

Dieses ist vermutlich der ein einzelne Bereich, in dem ein Win32 API besser entworfen ist, als der GNU/Linux oder Unix-API Satz.  In GNU/Linux und in Unix gibt es die spezifischen API, zum der verschiedenen Arten von Ereignissen zu warten: