gpt4 book ai didi

swift - 在异步任务中锁定和解锁 dispatch_queue_t

转载 作者:行者123 更新时间:2023-11-28 08:39:24 27 4
gpt4 key购买 nike

我想要锁定 LockQueue2 以完成进程,当解锁 LockQueue2 时,在 dispatch_after 中显示“number is :”number >.

我需要这个输出:

number set value 1
number is 1
number set value 2
number is 2
number set value 3
number is 3

let LockQueue = dispatch_queue_create("LockQueue", nil)

func test(num :Int){
var number = 0
let LockQueue2 = dispatch_queue_create("LockQueue2", nil)

dispatch_async(LockQueue){
LockQueue2.lock()
// any process or waiting
sleep(2)
dispatch_sync(LockQueue2) {
number = num
print("number set value ", number)
LockQueue2.unlock()
}
}
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)){
// any process or waiting
sleep(3)
dispatch_after(LockQueue2) {
print("number is :", number)//*** show number set in last dispatch ***
}
}
}

test(1)
test(2)
test(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)

如您所见,我会让队列协调我的进程,排除使用信号量等,它们很容易被滥用并导致死锁。

如果这些任务中的过程本身是异步的,它可能会寻求其他模式(组合、自定义异步 Operation 子类等)。但对于像这样的简单同步任务,串行调度队列就足够了。


参见 previous revision Swift 2 版本的这个答案。

关于swift - 在异步任务中锁定和解锁 dispatch_queue_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36781995/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com