Domanda

Io sono il mantenimento di un'applicazione di carbonio C ++ su OS X. C'è un "blocco di selezione" in uno degli oggetti nel codice che assomiglia a questo,

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

C'è un post rendering callback manutenzione che viene inviato al AudioUnitAddRenderNotify () che imposta il mState di questi vari oggetti.

Stavo pensando di utilizzare il built-in famiglia OSSpinLock di funzioni di sostituire questo (se non altro perché sono thread-safe e il codice di cui sopra non sembra essere).

Questo sarebbe un equivalente ragionevole? Dovrei anche aggiungere che una certa protezione di blocco nel filo di manutenzione che manipola il mState di questi oggetti?

OSSpinLock spin_lock = OS_SPINLOCK_INIT;

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

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

OSSpinLockUnlock(&spin_lock);
È stato utile?

Soluzione

Non utilizzare uno spinlock - spinlocks cicli di CPU rifiuti, loop senza fine fino a quando ottengono il blocco. Spinlocks dovrebbero essere utilizzati solo quando il tempo che il blocco si terrà sarà molto breve.

Una migliore alternativa sarebbe quella di utilizzare un condizione variabile, come quelli disponibili nei pthreads biblioteca. In questo modo, il tuo thread dormirà e non perdere alcun cicli della CPU fino a quando la condizione è soddisfatta. Vedere l'esempio elencati in quel link per sapere come utilizzare pthread variabili di condizione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top