Frage

Ich habe die folgenden Fragen zu C1X -Mutexes (§7.25.4):

In denen Situationen können mtx_lock() Rückkehr thrd_busy Anstatt zu blockieren? In denen Situationen können mtx_timedlock() Rückkehr thrd_busy?

Beachten Sie, dass thrd_busy wird in §7.25.1 ¶5 als zurückgegeben definiert. "Wenn eine von einem Test- und Rückgabefunktion angeforderte Ressource bereits verwendet wird".

Ich würde erwarten thrd_busy nur zurückgegeben von mtx_trylock(), oder höchstens auch von mtx_lock() Wenn mit einem aufgerufen mtx_try oder mtx_try | mtx_recursive Mutex, aber definitiv nicht von mtx_timedlock(), was einen Mutex erfordert, der Timeout unterstützt, dh a mtx_timed oder mtx_timed | mtx_recursive Mutex.

Ist das gerechte und Kontrolle im Entwurf? Oder vermisst ich etwas?

War es hilfreich?

Lösung

Wenn der Mutex nicht rekursiv ist, aber Sie versuchen, ihn rekursiv zu sperren, ist das Verhalten undefiniert. Eine Implementierung könnte dies jedoch erkennen und zurückkehren thrd_busy. (Alternativ kann es für immer blockieren oder zurückkehren thrd_error, oder thrd_success, oder formatieren Sie Ihre Festplatte .....)

Andere Tipps

  1. MTX_LOCK () gibt Thrd_busy nicht zurück, die Funktion mtx_trylock gibt jedoch thrd_busy zurück, wenn die angeforderte Ressource bereits verwendet wird.
  2. mtx_timedlock () gibt Thrd_busy nicht zurück. Die Funktion mtx_timedlock gibt Thrd_Success über den Erfolg zurück oder thrd_timedout, wenn die angegebene Zeit ohne Erwerb der angeforderten Ressource oder Thrd_Errorif die Anfrage nicht eingehalten werden konnte.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top