Swift 在异步任务中锁定和解锁调度队列
我希望锁定Swift 在异步任务中锁定和解锁调度队列,swift,grand-central-dispatch,Swift,Grand Central Dispatch,我希望锁定LockQueue2以完成此过程,当解锁LockQueue2时,在dispatch\u中显示“number is:”number 我需要这个输出: 数字设置值1 数字是1 数字设置值2 数字是2 数字设置值3 号码是3 如果您正在处理简单的同步任务,就像您一样,您可以使用串行队列: let queue = DispatchQueue(label: "com.domain.app.serialqueue") var number = 0 func simpleSer
LockQueue2
以完成此过程,当解锁LockQueue2
时,在dispatch\u中显示“number is:”number
我需要这个输出:
数字设置值1
数字是1
数字设置值2
数字是2
数字设置值3
号码是3
如果您正在处理简单的同步任务,就像您一样,您可以使用串行队列:
let queue = DispatchQueue(label: "com.domain.app.serialqueue")
var number = 0
func simpleSerialQueue(_ num: Int) {
queue.async { [self] in
Thread.sleep(forTimeInterval: 2)
number = num
print("number set value: ", number)
}
queue.async { [self] in
let value = number
DispatchQueue.global(qos: .background).async {
print("number is:", value) //*** show number set in last dispatch ***
}
}
}
simpleSerialQueue(1)
simpleSerialQueue(2)
simpleSerialQueue(3)
如您所见,我会让队列协调我的进程,避免使用信号量等,这很容易被误用并导致死锁
如果这些任务中的进程本身是异步的,那么它可能需要其他模式(组合、自定义异步操作子类等)。但对于这样的简单同步任务,串行调度队列就足够了
请参阅Swift 2格式副本的答案。如果您希望某个随机线程上的进程等待另一个进程,您可能会使用信号量,而不是锁。所以,创建一个信号量,让第二个进程等待一个信号,然后让第一个进程发送该信号量。或者使用串行队列。谢谢亲爱的@Rob,你能给我一个例子吗?这是非常完整的答案,第2节解决了我的问题,非常感谢。
let queue = DispatchQueue(label: "com.domain.app.serialqueue")
var number = 0
func simpleSerialQueue(_ num: Int) {
queue.async { [self] in
Thread.sleep(forTimeInterval: 2)
number = num
print("number set value: ", number)
}
queue.async { [self] in
let value = number
DispatchQueue.global(qos: .background).async {
print("number is:", value) //*** show number set in last dispatch ***
}
}
}
simpleSerialQueue(1)
simpleSerialQueue(2)
simpleSerialQueue(3)