Frage

Ich baue derzeit einen dünnen C ++ Wrapper um pThreads für den internen Gebrauch. Windows als auch QNX wird gezielt und zum Glück des pthreads-win32-Ports scheint zu funktionieren sehr gut, während QNX konforme zu POSIX für unsere praktischen Zwecke ist.

Jetzt, während Semaphore Umsetzung, traf ich die Funktion

sem_post_multiple(sem_t*, int)

, die offenbar nur auf pthreads-win32 verfügbar ist, aber von QNX fehlt. Wie der Name schon sagt ist die Funktion soll die Semaphore durch die Zählung als zweites Argument angegeben erhöhen. Soweit ich die Funktion sagen kann, ist nicht Teil der weder POSIX 1b noch POSIX 1c.

Obwohl es derzeit keine Voraussetzung für die Funktion, die ich bin immer noch fragen, warum pthreads-win32 die Funktion bietet und ob es von Nutzen sein könnte. Ich konnte zu imitieren versuchen, es für QNX mit ähnlich den folgenden:

sem_post_multiple_qnx(sem_t* sem, int count)
{
   for(;count > 0; --count)
   {
       sem_post(sem);
   }
} 

Was ich frage nach sind Vorschlag / Beratung über das weitere Vorgehen. Wenn Konsens legt nahe, um die Funktion implementieren für QNX ich auch Kommentare zu schätzen wissen würde, ob der vorgeschlagene Code snipped ist eine praktikable Lösung.

Vielen Dank im Voraus.

PS: ich absichtlich meine Phantasie C ++ Klasse für Klarheit aus. Für alle Leute zur Rettung was darauf hindeutet, boost: es ist keine Option in meinem aktuellen Projekt auf Grund von Management Gründen

.
War es hilfreich?

Lösung

Auf jeden Fall Semaphore sind eine optionale Erweiterung in POSIX. Z. B O X scheint sie nicht in vollem Umfang umzusetzen. Also, wenn Sie mit der Portabilität betrifft, so müssten Sie Wrapper der Funktionalitäten, die Sie benötigen, sowieso.

Ihr Ansatz einen Atom Zuwachs von iterativen sem_post zu emulieren hat sicherlich Nachteile.

  • Es könnte schlecht aufführen, wo in der Regel sem_t verwendet in Performance kritische Kontexte.
  • Diese Operation wäre nicht atomar. Also Dinge verwirrend könnte passieren, bevor Sie die Schleife beenden.

Ich würde halten Sie sich an die gerade notwendig, streng konform POSIX. Beachten Sie, dass sem_timedwait ist noch ein weiterer optionaler Bestandteil der Semaphore Option.

Andere Tipps

Ihre vorgeschlagene Umsetzung von sem_post_multiple nicht gut mit sem_getvalue spielt, da sem_post_multiple eine atomare Anstieg ist und daher ist es nicht möglich, dass eine „gleichzeitige“ Aufruf an sem_getvalue jede der Zwischenwerte zurückzukehren.

Persönlich möchte ich würde so gerettet verlassen versucht, grundlegende Synchronisationsvorgänge zu einem System hinzuzufügen, die ihnen fehlt, ist ein Spiel für Becher und Ihre Wrapper könnte bald aufhören „dünn“ zu sein. Also nicht in sie erhalten, wenn Sie Code haben, dass Verwendungen sem_post_multiple, dass Sie absolut in den Hafen haben.

sem_post_multiple () ist eine Nicht-Standard-Helferfunktion durch das win32-pthreads Maintainer eingeführt. Ihre Implementierung ist nicht das gleiche wie die ihre, weil die mehrere Verringerungen nicht atomar sind. Unabhängig davon, ob dies ein Problem von der beabsichtigten Verwendung abhängt. (Ich persönlich würde nicht versuchen, diese Funktion zu implementieren, es sei denn, /, bis die Notwendigkeit entsteht.)

Dies ist eine interessante Frage. +1.

Ich bin damit einverstanden hier mit dem aktuellen vorherrschenden Konsens darüber, dass es wahrscheinlich keine gute Idee ist, diese Funktion zu implementieren. Während Ihre vorgeschlagene Umsetzung wahrscheinlich gut funktioniert in den meisten Situationen wäre, gibt es definitiv Bedingungen, in denen die Ergebnisse aufgrund der Nicht-Unteilbarkeit dramatisch anders sein könnten. Im Folgenden ist eine (sehr) erfundene Situation:

  • Start Thread A, die sem_post_multiple (s, 10)
  • ruft
  • Thread B auf s warten freigegeben wird. Thread B tötet Thread A.

In der oben unfreundlichen Szenario, das Atom Version die Semaphore durch 10. Bei Nicht-Atom Version erhöht hätte, kann es nur einmal erhöht werden. Dieses Beispiel ist sicherlich nicht wahrscheinlich in der realen Welt. Zum Beispiel ist die Tötung eines Fadens fast immer eine schlechte Idee nicht die Tatsache zu erwähnen, dass es das Semaphore-Objekt in einem ungültigen Zustand verlassen konnte. Die Win32-Implementierung könnte eine Mutex-Sperre auf dem Semaphore lassen - sehen dies dafür, warum .

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