Junior
¿Qué es un mutex?
sobes.tech AI
Respuesta de la IA
El mutex (mutual exclusion) es un mecanismo de sincronización que se utiliza para proteger un recurso compartido contra accesos simultáneos desde múltiples hilos (o procesos). En cada momento, solo un hilo puede poseer el mutex y, por lo tanto, acceder al recurso protegido.
Operaciones principales con el mutex:
- lock (bloqueo): Intento de adquirir la posesión del mutex. Si el mutex está libre, el hilo lo adquiere y continúa la ejecución. Si ya está ocupado por otro hilo, el hilo actual se bloquea hasta que el mutex sea liberado.
- unlock (liberación): Liberar la posesión del mutex. Esto permite que otro hilo en espera lo adquiera. Es importante que el mutex sea liberado por el mismo hilo que lo adquirió.
Por ejemplo, en Objective-C o Swift, se puede usar NSLock para trabajar con mutexes.
Ejemplo de uso de NSLock en Objective-C:
// Objective-C
#import <Foundation/Foundation.h>
@interface MyClass : NSObject {
NSLock *_lock;
int _sharedResource;
}
@end
@implementation MyClass
- (instancetype)init {
self = [super init];
if (self) {
_lock = [[NSLock alloc] init];
_sharedResource = 0;
}
return self;
}
- (void)updateSharedResource {
[_lock lock]; // Adquiere el mutex
@try {
// Trabaja con _sharedResource - sección crítica
_sharedResource++;
NSLog(@"Recurso compartido actualizado a %d por el hilo %@", _sharedResource, [NSThread currentThread]);
}
@finally {
[_lock unlock]; // Libera el mutex
}
}
@end
Ejemplo de uso de NSLock en Swift:
// Swift
import Foundation
class MyClass {
private let lock = NSLock()
private var sharedResource = 0
func updateSharedResource() {
lock.lock() // Adquiere el mutex
// Trabaja con sharedResource - sección crítica
sharedResource += 1
print("Recurso compartido actualizado a \(sharedResource) por el hilo \(Thread.current)")
lock.unlock() // Libera el mutex
}
}
Los mutexes previenen condiciones de carrera y garantizan la integridad de los datos en accesos paralelos. Un uso incorrecto de los mutexes puede llevar a bloqueos mutuos (deadlocks).