Estoy tratando de crear un mutex de bloqueo de giro realmente simple en C y por alguna razón estoy obteniendo casos en los que dos hilos obtienen el bloqueo al mismo tiempo, lo que no debería ser posible. Se ejecuta en un sistema multiprocesador, que puede ser el motivo por el cual hay un problema. ¿Alguna idea de por qué no está funcionando?Implementando un bloqueo Mutex en C
void mutexLock(mutex_t *mutexlock, pid_t owner)
{
int failure = 1;
while(mutexlock->mx_state == 0 || failure || mutexlock->mx_owner != owner)
{
failure = 1;
if (mutexlock->mx_state == 0)
{
asm(
"movl $0x01,%%eax\n\t" // move 1 to eax
"xchg %%eax,%0\n\t" // try to set the lock bit
"mov %%eax,%1\n\t" // export our result to a test var
:"=r"(mutexlock->mx_state),"=r"(failure)
:"r"(mutexlock->mx_state)
:"%eax"
);
}
if (failure == 0)
{
mutexlock->mx_owner = owner; //test to see if we got the lock bit
}
}
}
El objetivo de un mutex es que pueda ejecutarse en varios procesadores. El objetivo es mantener segura la sección crítica y debería ser así sin importar cuántos procesadores haya en el sistema. – Kaili
Oooh pero me gusta el código, muy bien. Nunca he hecho nada con asm de c. – Kaili
¿Su O/s no ofrece mutex? ¿No podría considerar uno que lo haga? Lo siento, pero esto suena a reinventar la rueda, aunque supongo que tienes una buena razón para hacerlo. – Mawg