Ajuda * uso OSSpinLock para substituir um while (true) {sono (1);}
-
06-09-2019 - |
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);
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.