【问题标题】: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
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-27
      • 1970-01-01
      • 2011-08-29
      • 2023-01-25
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多