Tengo dos hilos, uno que trabaja en un bucle estrecho, y el otro, que en ocasiones resulta necesario realizar una sincronización con la primera:pthreads: el hambre hilo causada por una rápida re-bloqueo
// 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);
}
Mi intención es que el hilo 2 puede, al tomar el bloqueo, pausar efectivamente el hilo 1 y realizar la sincronización necesaria. El subproceso 1 también puede ofrecer pausa, al desbloquear, y si el subproceso 2 no está esperando en el bloqueo, vuelva a bloquearlo y vuelva a funcionar.
El problema que he encontrado es que los mutexes no son justos, por lo que el hilo 1 rápidamente vuelve a bloquear el mutex y ahoga el hilo 2. He intentado usar pthread_yield
, y hasta ahora parece funcionar bien, pero no estoy Seguro que funcionará para todos los sistemas/número de núcleos. ¿Hay alguna manera de garantizar que el hilo 1 siempre cederá al hilo 2, incluso en sistemas multi-core?
¿Cuál es la forma más efectiva de manejar este proceso de sincronización?
Lo que se ha descrito en su pregunta no tiene relación con la equidad, si usted quiere Tema 2 sea de mayor prioridad luego pase 1, una de las maneras para lograrlo, mediante el uso de variables de condición. – Michael
Esta pregunta es muy similar a [* sección crítica Fair (Linux) *] (http://stackoverflow.com/q/6449732/134633). – caf