我正在尝试了解使用Grand Central Dispatch (GCD)实现并发读排他写模式以控制资源访问的正确方法。
假设有一个NSMutableDictionary经常被读取,偶尔会被更新。如何确保读取始终使用字典的一致状态呢?当然我可以使用一个队列来序列化所有对字典的读和写访问,但这将不必要地序列化读取,因为读取应该可以并发访问字典。使用组的方法听起来很有前途。我可以创建一个“读”组并将每个读操作添加到其中。这样就允许读取同时进行。然后,在进行更新时,我可以将dispatch_notify()或dispatch_wait()作为写操作的一部分进行调度,以确保在允许更新之前所有读取都完成。但是,如何确保后续的读操作在写操作完成之前不开始?
以下是我提到的字典的示例: R1:在0秒时读取,需要5秒才能完成 R2:在2秒时另一个读取操作进入,需要5秒才能完成 W1:在4秒时进行写操作,需要3秒钟才能访问字典 R3:在6秒时另一个读取操作进入,需要5秒才能完成 W2:在8秒时进行另一个写操作,也需要3秒钟才能完成
理想情况下,上述过程应该如下所示: R1从0秒开始,结束于5秒 R2从2秒开始,结束于7秒 W1从7秒开始,结束于10秒 R3从10秒开始,结束于15秒 W2从15秒开始,结束于18秒
请注意:即使R3在6秒钟时到达,但它也不被允许在W1之前开始,因为W1先到。
使用GCD实现上述内容的最佳方法是什么?
假设有一个NSMutableDictionary经常被读取,偶尔会被更新。如何确保读取始终使用字典的一致状态呢?当然我可以使用一个队列来序列化所有对字典的读和写访问,但这将不必要地序列化读取,因为读取应该可以并发访问字典。使用组的方法听起来很有前途。我可以创建一个“读”组并将每个读操作添加到其中。这样就允许读取同时进行。然后,在进行更新时,我可以将dispatch_notify()或dispatch_wait()作为写操作的一部分进行调度,以确保在允许更新之前所有读取都完成。但是,如何确保后续的读操作在写操作完成之前不开始?
以下是我提到的字典的示例: R1:在0秒时读取,需要5秒才能完成 R2:在2秒时另一个读取操作进入,需要5秒才能完成 W1:在4秒时进行写操作,需要3秒钟才能访问字典 R3:在6秒时另一个读取操作进入,需要5秒才能完成 W2:在8秒时进行另一个写操作,也需要3秒钟才能完成
理想情况下,上述过程应该如下所示: R1从0秒开始,结束于5秒 R2从2秒开始,结束于7秒 W1从7秒开始,结束于10秒 R3从10秒开始,结束于15秒 W2从15秒开始,结束于18秒
请注意:即使R3在6秒钟时到达,但它也不被允许在W1之前开始,因为W1先到。
使用GCD实现上述内容的最佳方法是什么?