Sobes.tech
Junior

O que é um mutex?

sobes.tech IA

Resposta da IA

O mutex (exclusão mútua) é um mecanismo de sincronização utilizado para proteger um recurso partilhado contra acessos simultâneos de múltiplos threads (ou processos). Em cada momento, apenas um thread pode possuir o mutex e, consequentemente, aceder ao recurso protegido.

Operações principais com o mutex:

  • lock (bloqueio): Tentativa de adquirir a posse do mutex. Se o mutex estiver livre, o thread obtém-no e continua a execução. Se já estiver ocupado por outro thread, o thread atual fica bloqueado até que o mutex seja libertado.
  • unlock (desbloqueio): Liberta a posse do mutex. Isto permite que outro thread em espera o adquira. É importante que o mutex seja libertado pelo mesmo thread que o adquiriu.

Por exemplo, em Objective-C ou Swift, pode-se usar NSLock para trabalhar com mutexes.

Exemplo de uso de NSLock em 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]; // Bloqueia o mutex
    @try {
        // Trabalha com _sharedResource - secção crítica
        _sharedResource++;
        NSLog(@"Recurso partilhado atualizado para %d pelo thread %@", _sharedResource, [NSThread currentThread]);
    }
    @finally {
        [_lock unlock]; // Liberta o mutex
    }
}

@end

Exemplo de uso de NSLock em Swift:

// Swift
import Foundation

class MyClass {
    private let lock = NSLock()
    private var sharedResource = 0

    func updateSharedResource() {
        lock.lock() // Bloqueia o mutex
        // Trabalha com sharedResource - secção crítica
        sharedResource += 1
        print("Recurso partilhado atualizado para \(sharedResource) pelo thread \(Thread.current)")
        lock.unlock() // Liberta o mutex
    }
}

Os mutexes evitam condições de corrida (race conditions) e garantem a integridade dos dados em acessos paralelos. Uso incorreto de mutexes pode levar a deadlocks (interbloqueios).