gpt4 book ai didi

快速信号量命令行工具项目等待组完成

转载 作者:行者123 更新时间:2023-11-30 10:36:52 26 4
gpt4 key购买 nike

似乎不用等到小组结束

let oneSem_1 = DispatchSemaphore(value: 1)
let semaphore = DispatchSemaphore(value: 4)
let semaphoreEND = DispatchSemaphore(value: 0)
var p=0
let group_2 = DispatchGroup()
var t:[Int]=[]
let MAX=1000000
for _ in 0..<MAX {
group_2.enter()
DispatchQueue.global().async{
//group_2.enter()
semaphore.wait()

oneSem_1.wait()
p+=1
t.append(p)//car ressource critique, sinon pas rempli à fond
oneSem_1.signal()

if p == MAX{
print("p == MAX")
semaphoreEND.signal()
}

semaphore.signal()
//group_2.leave()
}
group_2.leave()
}

group_2.wait()
// semaphoreEND.wait()

// while(p != MAX){
// usleep(1_00_000)
// print("p=",p)
// }
print("END p=\(p) t.count=\(t.count)")

我期望的输出ND p=1000000 t.count=1000000

如果我取消注释//semaphoreEND.wait(),我可以获得这个结果

,但实际输出是

END p=999871 t.count=999881

其他问题:t.count != p

与小组一起,我期待所有任务的结束。为什么我必须取消注释//semaphoreEND.wait() ?

谢谢

项目可供下载:https://github.com/fredOnGitHub/semaphore_to_modify_1

最佳答案

此问题的解决方案:

我把 group_2.leave() 放在了一个不好的地方。喜欢这里Waiting until the task finishes && GCD explain和其他类似 2. DispatchGroup你必须把它放在他完成的异步函数中

func task(){
// sleep(1)
oneSem_1.wait()
p+=1
t.append(p)//car ressource critique, sinon pas rempli à fond
oneSem_1.signal()
}

print("start")
for _ in 0..<MAX {
group_2.enter()
DispatchQueue.global().async{
semaphore.wait()
// print("wake up")
task()
// print("end")
group_2.leave()
semaphore.signal()
}
}
group_2.wait()
print("END p=\(p) t.count=\(t.count)")

使用这个解决方案,我不需要测试 p == MAX 是否可以解锁数组的最终打印 (semaphoreEND.signal())

但是,vadian 有一个很好的注释。 “不,你必须明确地启动和停止运行循环。”

我正在寻找这个实现,它太神奇了,退出

关于快速信号量命令行工具项目等待组完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57802243/

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