Mutex (Mutual Exclusion - взаимное исключение) — это механизм синхронизации, который обеспечивает эксклюзивный доступ к общему ресурсу только одному потоку в данный момент времени. Это один из фундаментальных примитивов для работы с многопоточностью.
import Foundation
class ThreadSafeCounter {
private var count = 0
private var mutex = pthread_mutex_t()
init() {
pthread_mutex_init(&mutex, nil)
}
deinit {
pthread_mutex_destroy(&mutex)
}
func increment() {
pthread_mutex_lock(&mutex)
count += 1
pthread_mutex_unlock(&mutex)
}
func getCount() -> Int {
pthread_mutex_lock(&mutex)
defer { pthread_mutex_unlock(&mutex) }
return count
}
}
Защита общих ресурсов:
Синхронизация доступа:
Реализация thread-safe структур:
POSIX mutex (pthread_mutex_t):
NSLock:
// Пример с NSLock
class SafeArray<T> {
private var array = [T]()
private let lock = NSLock()
func append(_ element: T) {
lock.lock()
defer { lock.unlock() }
array.append(element)
}
}
// Пример с os_unfair_lock
import os
class ThreadSafeValue {
private var value: Int = 0
private var lock = os_unfair_lock()
func set(newValue: Int) {
os_unfair_lock_lock(&lock)
value = newValue
os_unfair_lock_unlock(&lock)
}
}
Дедлоки:
Рекурсивные mutex:
pthread_mutex_t
с атрибутом PTHREAD_MUTEX_RECURSIVE
Производительность:
Serial DispatchQueue:
let serialQueue = DispatchQueue(label: "com.example.serial")
serialQueue.sync { /* безопасный доступ */ }
Actors (Swift 5.5+):
actor SafeCounter {
private var count = 0
func increment() { count += 1 }
}
mutex — это фундаментальный механизм синхронизации для защиты общих ресурсов в многопоточной среде. В iOS доступно несколько реализаций mutex с разными характеристиками. Хотя в современных Swift-проектах предпочтительнее использовать высокоуровневые абстракции (DispatchQueue, Actors), понимание mutex важно для работы с legacy-кодом, системным программированием и оптимизации производительности.