通过许多不同的GCD队列访问硬盘是否安全?

Enc*_*ada 2 cocoa objective-c grand-central-dispatch

安全吗?例如,如果我创建了一堆不同的GCD队列,每个队列压缩(tar cvzf)一些文件,我做错了吗?硬盘会被破坏吗?

或者系统是否妥善处理这些事情?

bbu*_*bum 5

迪特里希的答案是正确的,除了一个细节(这是完全不明显的).

如果您要tar通过GCD分离100个异步执行,您很快就会发现在您的应用程序中运行了100个线程(由于严重滥用I/O子系统,这也会导致死机速度慢).

在具有队列的完全异步并发系统中,无法知道某个特定工作单元是否被阻塞,因为它正在等待系统资源或等待其他一些已排队的工作单元.因此,任何时候阻止任何东西,你几乎必须启动另一个线程并使用另一个工作单元或冒险锁定应用程序.

在这种情况下,"明显"的解决方案是在工作单元块之前等待一段时间,然后再启动另一个线程以解除排队并处理另一个工作单元,希望第一个工作单元"解锁"并继续处理.

但是,这样做意味着任何具有工作单元之间交互的异步并发系统 - 一种常见的情况 - 都会非常慢而无法使用.

更有效的是限制任何时候在全局异步队列中排队的工作单元数.GCD信号量使这很容易; 你有一个串行队列,所有工作单元都排入其中.每次出列工作单元时,都会增加信号量.每次完成一个工作单元,就会减少信号量.只要信号量低于某个最大值(例如,4),就会将新的工作单元排入队列.