是否有过任何理由块添加到串行调度队列异步而不是同步?串行调度队列异步块
据我所知,串行调度队列只有在前面的任务完成执行后才开始执行队列中的下一个任务。如果是这种情况,我不能通过异步提交一些块 - 提交行为不会阻止该线程(因为它直接返回)而无法执行任务直到最后一项任务完成,所以在我看来,你并没有真正获得任何东西。
此问题由以下代码提示 - 取自设计模式的书籍章节。为了防止底层data
阵列被两个单独的线程同时修改,所有修改任务都被添加到串行调度队列中。但请注意,returnToPool
异步添加任务到此队列,而getFromPool
同步添加其任务。
class Pool<T> {
private var data = [T]();
// Create a serial dispath queue
private let arrayQ = dispatch_queue_create("arrayQ", DISPATCH_QUEUE_SERIAL);
private let semaphore:dispatch_semaphore_t;
init(items:[T]) {
data.reserveCapacity(data.count);
for item in items {
data.append(item);
}
semaphore = dispatch_semaphore_create(items.count);
}
func getFromPool() -> T? {
var result:T?;
if (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) == 0) {
dispatch_sync(arrayQ, {() in
result = self.data.removeAtIndex(0);
})
}
return result;
}
func returnToPool(item:T) {
dispatch_async(arrayQ, {() in
self.data.append(item);
dispatch_semaphore_signal(self.semaphore);
});
}
}
与“removeFromPool”形成鲜明对比的是,为什么'getFromPool'最适合作为同步调用的解释是非常有用的。 – 2015-03-03 09:41:22