Concurrency 用于读取或写入的并发或串行队列

Concurrency 用于读取或写入的并发或串行队列,concurrency,grand-central-dispatch,serial-processing,Concurrency,Grand Central Dispatch,Serial Processing,我正在编写一个类似于NSCache的NSObject子类,它可以将文件缓存到iOS设备上的磁盘上 我正在为(I)读(ii)写写队列,但我想确保我将创建的队列类型是正确的,因此不会导致将来文件损坏的问题 对于读取队列,我计划创建一个并发队列,因为可以同时读取多个文件而不会出现任何问题 但是,对于写入队列,我计划创建一个串行队列,以防止一次写入多个文件 您能告诉我这是否是正确的方法吗?根据您的以下评论,我认为您正在寻找的模式/用法是一个串行队列(每个缓存对象/文件一个),其中包含用于写入缓存项的di

我正在编写一个类似于
NSCache
NSObject
子类,它可以将文件缓存到iOS设备上的磁盘上

我正在为(I)读(ii)写写队列,但我想确保我将创建的队列类型是正确的,因此不会导致将来文件损坏的问题

对于读取队列,我计划创建一个并发队列,因为可以同时读取多个文件而不会出现任何问题

但是,对于写入队列,我计划创建一个串行队列,以防止一次写入多个文件


您能告诉我这是否是正确的方法吗?

根据您的以下评论,我认为您正在寻找的模式/用法是一个串行队列(每个缓存对象/文件一个),其中包含用于写入缓存项的dispatch_async()'d块和用于读取缓存项的dispatch_sync()(注意区别)。在串行队列上,写操作可以是异步的,这仍将保持它们的有序性,并且执行同步读取将强制完成所有挂起的写操作,然后再尝试读回值

根据您的follow评论,我认为您正在寻找的模式/用法是一个串行队列(每个缓存对象/文件一个),其中包含用于写入缓存项的dispatch_async()'d块和用于读取缓存项的dispatch_sync()(注意区别)。在串行队列上,写操作可以是异步的,这仍将保持它们的有序性,并且执行同步读取将强制完成所有挂起的写操作,然后再尝试读回值

为了提高性能,我建议使用并发队列,读取时使用
dispatch\u sync
,写入时使用
dispatch\u barrier\u async
。作为迈克·阿什:

因为这使用了barrier函数,所以它确保在块运行时以独占方式访问缓存。它不仅在运行时排除对缓存的所有其他写入,而且还排除所有其他读取,从而使修改安全


为了获得更好的性能,我建议对读取使用
dispatch\u sync
,对写入使用
dispatch\u barrier\u async
的并发队列。作为迈克·阿什:

因为这使用了barrier函数,所以它确保在块运行时以独占方式访问缓存。它不仅在运行时排除对缓存的所有其他写入,而且还排除所有其他读取,从而使修改安全


这个问题中缺少一些关键信息,例如:假设正在读/写多个文件,是否保证每个文件在任何给定时间都只能读或写?为什么有多个文件?您是否看到多个线程在一个进程中保留多个缓存,或者多个线程访问一个缓存,或者什么?这只是一个一般性问题,我想知道每个进程最好使用哪种类型的队列,以及原因。这个问题中缺少一些关键信息,例如:假设正在读/写多个文件,是否保证在任何给定时间只读取或写入每个文件?为什么有多个文件?您是否看到多个线程在一个进程中保留多个缓存,或者多个线程访问一个缓存,或者什么?这只是一个一般性的问题,我想知道每个进程最好使用哪种类型的队列,以及原因。如果读取是并发的,不是更好吗?只要没有写入任何内容,就不需要等待其他读取。如果读取是并发的,不是更好吗?无需等待其他读取,只要未写入任何内容。