Frage

Ich bin eine Kohlenstoff C ++ Anwendung auf OS X. Aufrechterhaltung Es ist ein „Spin-Lock“ in eines der Objekte in dem Code, der wie folgt aussieht,

while ( mState != RELEASED )
{
    sleep( 1 );
}

Es gibt einen Post Wartung Rückruf machen, der AudioUnitAddRenderNotify zugeführt wird (), die die mstate dieser verschiedenen Objekte festgelegt würde.

Ich dachte über die Verwendung des eingebauten in OSSpinLock Familie von Funktionen, dies zu ersetzen (wenn sonst nichts, weil sie Thread-sicher sind und der obige Code scheint nicht zu sein).

Wäre dies ein angemessenes Äquivalent sein? Soll ich auch eine gewisse Sperre Schutz in dem Wartungsthread hinzuzufügen, die die mstate dieser Objekte manipulieren?

OSSpinLock spin_lock = OS_SPINLOCK_INIT;

if (!OSSpinLockTry(&spin_lock))
    OSSpinLockLock(&spin_lock);

while (mState != RELEASED)
    OSSpinLockTry(&spin_lock);

OSSpinLockUnlock(&spin_lock);
War es hilfreich?

Lösung

Sie keinen spinlock verwenden - spinlocks Abfall CPU-Zyklen, Looping endlos, bis sie die Sperre erhalten. Spinlocks sollte nur verwendet werden, wenn die Zeit, die die Sperre gehalten werden wird sehr kurz sein.

Eine bessere Alternative wäre ein Variable Bedingung zu verwenden, wie die, die in der pThreads Bibliothek. Auf diese Weise wird der Thread schlafen und keine CPU-Zyklen verschwenden, bis die Bedingung erfüllt ist. Siehe das Beispiel in diesem Link aufgeführt, wie pThreads Bedingungsvariablen verwenden.

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