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函数,所以它确保在块运行时以独占方式访问缓存。它不仅在运行时排除对缓存的所有其他写入,而且还排除所有其他读取,从而使修改安全
这个问题中缺少一些关键信息,例如:假设正在读/写多个文件,是否保证每个文件在任何给定时间都只能读或写?为什么有多个文件?您是否看到多个线程在一个进程中保留多个缓存,或者多个线程访问一个缓存,或者什么?这只是一个一般性问题,我想知道每个进程最好使用哪种类型的队列,以及原因。这个问题中缺少一些关键信息,例如:假设正在读/写多个文件,是否保证在任何给定时间只读取或写入每个文件?为什么有多个文件?您是否看到多个线程在一个进程中保留多个缓存,或者多个线程访问一个缓存,或者什么?这只是一个一般性的问题,我想知道每个进程最好使用哪种类型的队列,以及原因。如果读取是并发的,不是更好吗?只要没有写入任何内容,就不需要等待其他读取。如果读取是并发的,不是更好吗?无需等待其他读取,只要未写入任何内容。