Pergunta

Estou mantendo uma aplicação de carbono C ++ no OS X. Há um "bloqueio de rotação" em um dos objetos no código que se parece com isso,

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

Há um post tornar callback de manutenção que é alimentado para AudioUnitAddRenderNotify (), que iria definir o mstate destes vários objetos.

Eu estava pensando em usar o built-in família OSSpinLock de funções para substituir isso (se nada mais, porque eles são thread-safe e o código acima não parece ser).

isso seria um equivalente razoável? Devo também acrescentar alguma proteção de bloqueio no segmento de manutenção que manipula o mstate desses objetos?

OSSpinLock spin_lock = OS_SPINLOCK_INIT;

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

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

OSSpinLockUnlock(&spin_lock);
Foi útil?

Solução

Não use um spinlock - spinlocks desperdiçar ciclos de CPU, looping eternamente até se obter o bloqueio. Spinlocks só deve ser usado quando o tempo que o bloqueio será realizada será muito curto.

A melhor alternativa seria usar um condição variável, como os disponíveis na pthreads biblioteca. Desta forma, o segmento vai dormir e não perder quaisquer ciclos de CPU até que a condição é satisfeita. Veja o exemplo listado em que apontam para saber como usar pthreads variáveis ??de condição.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top