1
1
如果您使用cfsocket的非阻塞I/O调用,我同意,这应该都发生在主线程上,让操作系统处理并发问题,因为您只是复制数据,而不是真正进行任何计算。 除此之外,听起来你的应用程序需要做的其他工作就是维护一个要下载的项目队列。当任何一个传输完成时,cfsocket回调可以启动队列中下一个项目的传输。(如果队列是空的,则减少连接计数,如果向空队列中添加了某些内容,则启动新的传输。)我不明白为什么需要多个线程来完成此操作。 也许您遗漏了一些重要的东西,但是根据您的描述,应用程序是I/O绑定的,而不是CPU绑定的,所以所有并发性的东西只会生成更复杂的代码,对性能的影响最小。 在主线程上执行所有操作。 |
2
0
为了子孙后代的利益,在其他地方进行了一些讨论之后,我认为我将采用的解决方案基本上是:
所有这些工作都将在主线程上进行。解码每个下载结果的工作将被卸载到gcd,这样它就可以处理限制并发性的问题,并且不会阻塞主线程。 打开一个新的连接可能需要一段时间,因此在实际操作中创建一个新连接的过程可能会稍微复杂一些(例如,将下载排队,启动连接过程,然后在连接完全建立时将其出列)。但我仍然认为我对种族条件可能存在的看法被夸大了。 |
Noah H · 如何通过终端或Swift禁用三指轻拍手势? 6 年前 |
Dmitry Serov · 货币数字格式-数字为整数时省略分数部分 6 年前 |
Duny · ObjC日期始终返回2017年12月25日 6 年前 |
Jan Kaiser · NSButton不调用其操作 6 年前 |