Ho un due fili, uno che funziona in un ciclo stretto, e l'altro che ogni tanto ha bisogno di eseguire una sincronizzazione con la prima:pthreads: filo inedia causata da rapido ri-bloccaggio
// thread 1
while(1)
{
lock(work);
// perform work
unlock(work);
}
// thread 2
while(1)
{
// unrelated work that takes a while
lock(work);
// synchronizing step
unlock(work);
}
mia intenzione è che il thread 2 può, prendendo il blocco, sospendere efficacemente il thread 1 ed eseguire la sincronizzazione necessaria. Thread 1 può anche offrire di mettere in pausa, sbloccando, e se il thread 2 non è in attesa sul blocco, re-lock e torna al lavoro.
Il problema che ho riscontrato è che i mutex non sono corretti, quindi il thread 1 blocca rapidamente il mutex e affama il thread 2. Ho tentato di utilizzare pthread_yield
e finora sembra funzionare correttamente, ma non lo sono sicuro che funzionerà per tutti i sistemi/numero di core. C'è un modo per garantire che thread 1 sarà sempre il thread 2, anche su sistemi multi-core?
Qual è il modo più efficace per gestire questo processo di sincronizzazione?
Quello che hai descritto nella sua domanda non ha alcuna relazione con l'equità, se si vuole Thread 2 di essere con priorità superiore rispetto al filo 1, uno dei modi per realizzarlo, utilizzando le variabili di condizione. – Michael
Questa domanda è molto simile a [* Sezione critica (Linux) *] (http://stackoverflow.com/q/6449732/134633). – caf