Frage

Ich habe vor kurzem das Licht der Eventwaithandle leistungsstarken Verhaltens in C # gesehen und beschlossen, einige Funktionen in einer Schwester Anwendung zu bewegen, das Gleiche zu tun. Das einzige Problem ist, dass die Schwester app in C geschrieben wird.

Keine große Sache, ich bin mit pthreads, die einen pthread_cond_t Datentyp haben, der für die Signalisierung ermöglicht. Meine einzige Frage ist, ist es möglich, dass ein cond ‚signalisiert‘ werden, bevor etwas darauf wartet?

Im Moment meiner Tests sagen nein. Das heißt, wenn ThreadA ein Signal vor ThreadB feuert wartet, wird ThreadB indefinately warten. Gibt es einen anderen pthread Typ, der ich, dass verhält sich näher an die Funktionalität der Eventwaithandle in C # verwenden kann? Ein Objekt signalisiert wird, was bedeutet, dass der erste Thread auf sie zu warten, wird passieren sofort, und setzen Sie sich auf unsignalled.

die pthread_cond in einer anderen Datenstruktur Wrapping wäre nicht allzu schwierig sein, dies zu erreichen. Aber auch hier ist diese Funktionalität bereits in der pthread-Bibliothek?

War es hilfreich?

Lösung

Wenn Sie Bedingungsvariablen korrekt verwenden, wird dies keine Rolle.

Der grundlegende Ablauf des Codes soll (in Pseudo-Code) sein:

lock(lockobj);
while (!signalled) {
    wait(condvar);
}
signalled = false;
unlock(lockobj);

auf der Warteseite und:

lock(lockobj);
signalled = true;
notify(condvar);
unlock(lockobj);

auf der Signalisierungs Seite. (Natürlich ist das Sperrobjekt und Bedingungsvariablen verwendet haben die auf beiden Seiten gleich sein.) Ich hoffe, das hilft!

Andere Tipps

Alternative Antwort (auch in Pseudo-Code), wenn Sie wollen mehrere Signalisierungen (das heißt, wenn zweimal signalisiert, dann zwei Threads warten kann, bevor der Zustand unsignalled wieder).

Warte Seite:

lock(lockobj);
while (signalled != 0) {
    wait(condvar);
}
--signalled;
unlock(lockobj);

Signaling Seite:

lock(lockobj);
++signalled;
notify(condvar);
unlock(lockobj);

landete ich nur eine Konditionsart in einer neuen Struktur Einwickeln und einige einfache Funktionen erstellt ähnlich wie die Eventwaithandle von C # verhalten. Ich brauchte zwei mutexes richtigen serialisierten Zugriff auf acheive.

Das ist die cond_mutex zum Warten auf der bedingten Variable verwendet, während die data_mutex verwendet werden, wenn der Zustand von signalisiert nicht signalisiert Einstellung.

Der Reset-Modus ist das gleiche von C #. AUTO oder MANUAL. Dies ermöglicht die event_wait_t selbst zurückgesetzt wird automatisch nach einer Wartezeit. Oder lassen die Programmierer tun es manuell mit einem Aufruf an event_wait_reset (event_wait_t * ewh);

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