ReadWriteLock 1.0.3

ReadWriteLock 1.0.3

Joseph Newton 维护。



  • Joe Newton

ReadWriteLock

Codacy Badge License MIT CocoaPods Compatible Carthage Compatible Platform Code Coverage

Swift Package Xcode Project Cocoapods Carthage

ReadWriteLock 是一个轻量级框架,用于在 iOS、macOS、tvOS 和 watchOS 中安全且易于实现读/写锁。

安装

ReadWriteLock 通过 CocoaPodsCarthageSwift 包管理器 提供。

要通过 CocoaPods 安装,只需在 Podfile 中添加以下行

pod 'ReadWriteLock'

要通过 Carthage 安装,只需在 Cartfile 中添加以下行

github "SomeRandomiOSDev/ReadWriteLock"

要通过 Swift 包管理器安装,请在 Package.swift 文件的 dependencies 部分添加以下行

.package(url: "https://github.com/SomeRandomiOSDev/ReadWriteLock.git", from: "1.0.0")

使用方法

首先,在 Swift 文件顶部导入 ReadWriteLock

import ReadWriteLock

导入后,创建一个 ReadWriteLock 实例并开始获取锁

let lock = ReadWriteLock()
var protectedResource = ...

DispatchQueue.global(qos: .background).async {
    ...

    lock.acquireWriteLock {
        protectedResource = ...
    }
}

...

DispatchQueue.global(qos: .background).async {
    ...
    
    lock.acquireReadLock {
        process(protectedResource)
    }
}

或者你可以尝试条件性地获取锁。以这种方式获取锁不会阻塞,如果锁已被占用

...

lock.attemptAcquireReadLock { isLockAcquired in
    if isLockAcquired {
        process(protectedResource)
    } else {
        // `lock` is currently locked for writing. 
    }
}

获取锁使用 Swift 闭包来封装读写锁的生命周期。这防止了在释放 ReadWriteLock 对象时产生悬挂锁,并有助于防止死锁。请注意,如果你尝试在已获取读或写锁的作用域内获取写锁,或者获取写锁的作用域内获取读锁,线程将发生死锁

// All of these code blocks will deadlock

lock.acquireWriteLock {
    ...
    
    lock.acquireWriteLock {
        // deadlock
    }
}

lock.acquireReadLock {
    ...

    lock.acquireWriteLock {
        // deadlock
    }
}

lock.attemptAcquireWriteLock { isLockAcquired in
    ...

    if isLockAcquired {
        lock.acquireWriteLock {
            // deadlock
        }
    }
}

...

与传统的锁相比,读写锁的好处是你可能有(实际上是)无限多的读锁,甚至是嵌套的读锁,而不会发生死锁

lock.acquireReadLock {
    ...
    
    lock.acquireReadLock {
        // won't deadlock
    }
    
    lock.attemptAcquireReadLock { isLockAcquired in 
        // isLockAcquired is `true`
    }
}

读写锁非常适合同步访问属性

struct SynchronizedValue<T> {
    private var lock = ReadWriteLock()
    private var _value: T
    
    var value: T {
        get {
            return lock.acquireReadLock { _value }
        }
        set {
            lock.acquireWriteLock { _value = newValue }
        }
    }
}

贡献

如果您需要特定功能或遇到bug,请提交一个问题。如果您自己扩展了ReadWriteLock的功能或想要自己修复bug,请提交一个pull请求。

作者

Joe Newton, [邮箱地址保护,请手动删除此行]

许可证

ReadWriteLock在MIT许可证下可用。有关更多信息,请参阅LICENSE文件。