Что такое мьютекс (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).