【问题标题】:How to lock/unlock variable in Swift Perfect framework如何在 Swift Perfect 框架中锁定/解锁变量
【发布时间】:2018-02-23 12:27:13
【问题描述】:
如何在 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。
【问题讨论】:
标签:
swift
multithreading
perfect
【解决方案1】:
你应该:
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
}
}
}
}