Sobes.tech
Junior

Какво е мьютекс (mutex)?

sobes.tech AI

Отговор от AI

Мютекс (взаимно изключване) е механизъм за синхронизация, който се използва за защита на споделен ресурс от едновременен достъп от няколко нишки (или процеси). Във всеки момент само една нишка може да притежава мютекса и съответно да получи достъп до защитения ресурс.

Основни операции с мютекса:

  • lock (заключване): Опит за придобиване на владение на мютекса. Ако мютексът е свободен, нишката го взема и продължава изпълнението. Ако вече е зает от друга нишка, текущата нишка се блокира, докато мютексът не бъде освободен.
  • unlock (отключване): Освобождаване на владението на мютекса. Това позволява на друга чакаща нишка да го придобие. Важно е мютексът да бъде освободен от същата нишка, която го е взела.

Например, в Objective-C или Swift, може да се използва NSLock за работа с мютекси.

Пример за използване на NSLock в 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]; // Заключване на мютекса
    @try {
        // Работа с _sharedResource - критична секция
        _sharedResource++;
        NSLog(@"Общият ресурс е актуализиран до %d от нишка %@", _sharedResource, [NSThread currentThread]);
    }
    @finally {
        [_lock unlock]; // Освобождаване на мютекса
    }
}

@end

Пример за използване на NSLock в Swift:

// Swift
import Foundation

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

    func updateSharedResource() {
        lock.lock() // Заключване на мютекса
        // Работа с sharedResource - критична секция
        sharedResource += 1
        print("Общият ресурс е актуализиран до \(sharedResource) от нишка \(Thread.current)")
        lock.unlock() // Освобождаване на мютекса
    }
}

Мютексите предотвратяват състезателни условия (race conditions) и осигуряват цялостността на данните при паралелен достъп. Неправилната употреба може да доведе до deadlocks.