如何在 Swift Perfect 框架中锁定 var transactions
,以避免在我删除函数 storeTransactions()
中的所有项目之前由其他线程插入新事务:
class Foo {
var transactions: [Transaction] = []
func storeTransactions() {
let transactionStogare = Storage(transactions: self.transactions)
// <-- Some thread can append new transaction in this moment
self.transactions = []
// TODO: do something with transactionStogare
}
func appendTransaction(t: Transaction) {
self.transactions.append(t)
}
}
请记住,该解决方案也应该适用于 Linux。
最佳答案
你应该:
import PerfectThread
这为您提供了许多由框架本身实现的线程实用程序(因此,它在 Linux 和 macOS 上都可以处理)
在您的情况下,您希望从多个线程读取“共享数据”,但在写入时,它必须等待其他读/写线程完成其工作。您将使用 Threading.RWLock
。
你可以这样做:
class TransactionContainer {
let lock = Threading.RWLock()
private var _transactions: [Transactions]
var transactions: [Transactions] {
get {
defer { // This is done after return
lock.unlock()
}
lock.readLock() // Make a "read" lock, which permits
// multiple reads, but no concurrent
// writing.
return _transactions
}
set(value) {
lock.doWithWriteLock { // Do a write lock, which
// doesn't permit concurrent writing
// nor concurrent reading.
// This is an easier expression than
// using defer and lock.unlock()
// but can't be used for returning
// because it is closure
self._transactions = value
}
}
}
}
关于swift - 如何在 Swift Perfect 框架中锁定/解锁变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48947919/