Назад к вопросам
Junior
100
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Мьютекс (mutex, Mutual Exclusion) - это механизм синхронизации, который используется для защиты общего ресурса от одновременного доступа из нескольких потоков (или процессов). В каждый момент времени только один поток может владеть мьютексом и, соответственно, получить доступ к защищенному им ресурсу.

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

  • 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(@"Shared resource updated to %d by thread %@", _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("Shared resource updated to \(sharedResource) by thread \(Thread.current)")
        lock.unlock() // Освобождаем мьютекс
    }
}

Мьютексы предотвращают состояние гонки (race condition) и обеспечивают целостность данных при параллельном доступе. Неправильное использование мьютексов может привести к взаимным блокировкам (deadlocks).