我正在尝试运行三个并发任务,每个任务大约需要30秒。但是只有两个会在同一时间运行,第三个任务会在它开始之前等待其中一个完成。
我目前的代码:
func sliderMoved(_ label : UILabel, openCharacteristicNum : Int, closeCharacteristicNum : Int, sender: UISlider, sliderTimer:Timer){
//run this on a background thread
DispatchQueue.global(qos: .utility).async {
var actuatorPosition = self.getActuatorPosition(label)
if (actuatorPosition < sender.value) {
// stop closing (if it was) and start opening
self.writeValue(closeCharacteristicNum, value: 1, withResponse: false)
self.writeValue(openCharacteristicNum, value: 0, withResponse: false)
while actuatorPosition < senderValue && sliderTimer.isValid{
actuatorPosition = self.getActuatorPosition(label)
}
// stop opening
self.writeValue(openCharacteristicNum, value: 1, withResponse: false)
}
}
}
我还尝试创建并发队列并在该队列中运行三个任务,但仍然只有两个并发运行。我也尝试过创建三个独立的并发队列并在每个队列中运行一个任务,但仍然遇到同样的问题。
我唯一的猜测是,我正在达到iOS允许应用程序使用的硬线程限制,因为每个任务完全阻止线程直到完成。
答案 0 :(得分:1)
多核iOS设备只有2核,每个核心有1个线程,所以限制一次是2个线程。唯一的例外是拥有3核的iPad Air 2。
编辑: 这已不再是这种情况。自A10以来,它已经有2个大核心和2个或4个小核心。据我所知,Apple的A系列仍然只支持每个核心一个硬件线程。也就是说,libDispatch将为您管理线程池,它应为其运行的iOS设备选择最佳线程数,可用的硬件线程数是一个您不应该担心的低级细节。使用libDispatch。
答案 1 :(得分:0)
但仍有同样的问题
除了没有&#34;问题&#34;这里。
我唯一的猜测是,我遇到iOS允许应用程序使用的硬线程限制,因为每个任务完全阻止线程直到完成
我不会将其描述为“艰难的”#34;限制,但可能有限制。然而,重点是没有任何保证,所以你不应该有这样或那样的期望。 GCD的重点在于您关注队列并允许内核按照自己的意愿分配线程。而这正是它正在做的事情。您在队列上安排了操作,并最终执行了这些操作。别担心,快乐。