swift - 如何在 Swift Perfect 框架中锁定/解锁变量

标签 swift multithreading perfect

如何在 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/

相关文章:

c++ - 控制不同的硬件 : multithreading or something different?

c++ - 如何声明一个函数,它是一个类的成员并返回一个指向线程的函数指针?

具有完美 : Add a scheduled timer with interval to the runLoop 的 Swift 3 Linux

mysql - 在 Perfect 框架中使用 MySQL 连接器

ios - 在 MKMapViewDelegate 中执行代码之前设置一个计时器

ios - 优化级别影响比较枚举

ios - 当应用程序进入前台时如何重新加载 UITableView 数据? (Xcode 8.3/swift 3)

python,多线程,在公共(public)文件上使用 pandas "to_csv"安全吗?

swift - 在 Linux (Ubuntu) 上的 Swift 中使用 CommonCrypto/CommonHMAC.h 获取 SHA256

ios - 数组中的外部图像从一个 VController 到另一个 VController,不断获取(未解析的标识符)