Lock is a Swift package that provides a set of high-performance and thread-safe locking primitives.
Atomic: A property wrapper that provides atomic read and write operations for any value type.MutexLock: A wrapper for POSIXpthread_mutex_tthat provides mutual exclusion for critical sections.RWLock: A wrapper for POSIXpthread_rwlock_tthat provides read-write locks for shared resources.UnfairLock: A wrapper foros_unfair_lock_ton iOS, macOS, tvOS and watchOS andOSAllocatedUnfairLockon iOS 14 and later, macOS 11 and later, tvOS 14 and later, watchOS 7 and later.
- Swift 5.2 or later
- iOS 12.0 or later, macOS 10.12 or later, tvOS 10.0 or later, watchOS 3.0 or later
You can install Lock using the Swift Package Manager. Add the following dependency to your Package.swift file:
.package(url: "https://github.com/ezoushen/Lock.git", from: "1.0.0")And then add Lock to your target dependencies:
.target(name: "YourTarget", dependencies: ["Lock"]),Here's an example of how to use Atomic to make a counter thread-safe:
import Lock
let counter = Atomic(initialState: 0)
DispatchQueue.concurrentPerform(iterations: 100) { index in
counter.withMutableValue {
$0 += 1
}
}
print(counter.wrappedValue) // 100You can use MutexLock to protect a shared resource:
import Lock
let lock = MutexLock()
var sharedResource = 0
DispatchQueue.concurrentPerform(iterations: 100) { index in
lock.lock()
sharedResource += 1
lock.unlock()
}
print(sharedResource) // 100You can use RWLock for read-write locking:
import Lock
let lock = RWLock()
var sharedResource = 0
DispatchQueue.concurrentPerform(iterations: 100) { index in
lock.wrlock()
sharedResource += 1
lock.unlock()
}
DispatchQueue.concurrentPerform(iterations: 100) { index in
lock.rdlock()
print(sharedResource)
lock.unlock()
}You can use UnfairLock for lock/unlock operations:
import Lock
let lock = UnfairLock()
var sharedResource = 0
DispatchQueue.concurrentPerform(iterations: 100) { index in
lock.lock()
sharedResource += 1
lock.unlock()
}
print(sharedResource) // 100Lock is released under the MIT license. See LICENSE for details.