Frage

Ich bin Erweiterung der Funktionalität eines Semaphore. Ich lief in eine Straßensperre als ich merkte, ich weiß nicht, die Implementierung eines tatsächlichen Semaphore und um sicherzustellen, dass mein Code lief richtig, ich brauchte, dies zu wissen.

Ich kenne ein Semaphore Werke von Threads blockiert, die auf sie warten, wenn sie sem_wait () aufrufen und ein anderer Thread zur Zeit hat es gesperrt. Der Faden wird dann gesperrt und dann für diese Semaphore eine Warteliste gesetzt in.

Meine Frage bezieht sich auf das, was auf einem sem_post geschieht (). Ist der nächste Thread die Warteliste abziehbar, als Verriegelungsgewinde festgelegt und erlaubt unblockiert zu sein? Oder ist die Regelung für ganz andere Posting?

Danke!

War es hilfreich?

Lösung

Semaphore zwei Operationen haben:

  1. P() die Semaphore zu erwerben (Sie scheinen diese sem_wait zu nennen)
  2. V() die Semaphore freischalten (Sie scheinen diese sem_post zu nennen)

Semaphores hat auch eine ganze Zahl mit ihnen verbunden, die die Anzahl von gleichzeitigen Threads erlaubt ist passieren P (), ohne zu blockieren. Andere Anrufe zu P () blockiert, bis V () aufgerufen wird Flecken zu befreien.

Das ist die klassische Definition einer Semaphore.

Edit: Semaphore stellen keine Garantie der Bestellung. Sie haben nicht wirklich zu einer Warteschlange oder einem anderen FIFO-Struktur zu verwenden. Wenn nur ein Thread zu einem Zeitpunkt erlaubt ist, wenn es V () aufruft, eine andere (möglicherweise zufällig) Thread wird dann aus seiner P zurückkehren () aufrufen und weiter.

Andere Tipps

Der nächste Thread auf sie zu entsperren ist sem_wait() wird, was Thread das Betriebssystem entscheidet der nächste ist nach Kontext in schalten. Niemand macht jede Garantie der Bestellung; es hängt von Scheduling-Strategie, um Ihre Betriebssysteme. Es könnte den Faden sein, der von der CPU für die längste waren, oder derjenige, der die höchste „Priorität“ oder die eine zugewiesen wurde, die historisch bestimmte Ressource-Nutzungsstatistiken hatte, oder was auch immer.

Wahrscheinlich Ihr aktueller Thread (derjenige, der sem_post() genannt) wird auch weiterhin für eine Weile laufen, bis er entweder beginnt eine Benutzereingabe wartet, Blöcke auf einem anderen Semaphore oder läuft aus seiner os-zugewiesenen Zeitscheibe. Dann schaltet das OS in einigen völlig unabhängig Prozess für einen Bruchteil einer Sekunde (wahrscheinlich Firefox oder etwas) zu laufen, dann gehen und einige Netzwerk-Traffic bewältigen, bekommen selbst eine Tasse Tee, und schließlich, wenn es dazu kommt je nachdem, was Ihre andere Threads es, holt es sich anfühlt, basierend auf so etwas wie, ob fühlt es basierend auf Vergangenheit, dass der spezielle Thread mehr CPU oder I / O-gebunden.

ist

In vielen OSes wird die Priorität I / O-gebundene Prozesse gegeben, die nicht um sehr lange gewesen sein. Die Theorie ist, dass neue Prozesse kurzlebig sein könnte (wenn es sich um bereits fünf Stunden lang gewesen ist, stehen die Chancen, es wird nicht in den nächsten 1ms werden Finishing), so könnten wir sie auch hinter sich bringen. I / O-gebundene Prozesse sind wahrscheinlich zu sein, I / O-gebunden fortzusetzen, was bedeutet, dass die Chancen sind sie die CPU kurz auszuschalten gehen, während für andere Ressourcen warten. Grundsätzlich ist das OS will den Prozess finden, es wird in der Lage sein mit so schnell wie möglich durchgeführt werden, so kann es seinen Tee zu schlürfen und läuft Ihre Malware zurück.

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