Junior
Ce este un mutex?
sobes.tech AI
Răspuns de la AI
Mutex (Excludere Mutuală) este un mecanism de sincronizare utilizat pentru a proteja o resursă comună împotriva accesului simultan din partea mai multor fire (sau procese). În orice moment, doar un singur fir poate deține mutex-ul și, prin urmare, poate accesa resursa protejată.
Operațiuni principale cu mutex-ul:
- lock (blocare): Încercarea de a obține deținerea mutex-ului. Dacă mutex-ul este liber, firul îl preia și continuă execuția. Dacă este deja ocupat de alt fir, firul curent este blocat până când mutex-ul este eliberat.
- unlock (deblocare): Eliberarea deținerii mutex-ului. Acest lucru permite altui fir în așteptare să îl preia. Este important ca mutex-ul să fie eliberat de același fir care l-a deținut.
De exemplu, în Objective-C sau Swift, se poate folosi NSLock pentru a lucra cu mutex-uri.
Exemplu de utilizare a NSLock în 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]; // Blocarea mutex-ului
@try {
// Lucru cu _sharedResource - secțiune critică
_sharedResource++;
NSLog(@"Resursa partajată actualizată la %d de către firul %@", _sharedResource, [NSThread currentThread]);
}
@finally {
[_lock unlock]; // Eliberarea mutex-ului
}
}
@end
Exemplu de utilizare a NSLock în Swift:
// Swift
import Foundation
class MyClass {
private let lock = NSLock()
private var sharedResource = 0
func updateSharedResource() {
lock.lock() // Blocarea mutex-ului
// Lucru cu sharedResource - secțiune critică
sharedResource += 1
print("Resursa partajată actualizată la \(sharedResource) de către firul \(Thread.current)")
lock.unlock() // Eliberarea mutex-ului
}
}
Mutex-urile previn condițiile de cursă (race condition) și asigură integritatea datelor în accesul paralel. Utilizarea incorectă poate duce la deadlock-uri.