在iOS中,上述代码中的PV原语可以替代成GCD中的信号量API,dispatch_semaphore_t来实现,可是必要特殊维护一个readerCount以及实现readerCount互斥会见的信号量,手动实现较量贫困,封装成同一接口有必然难度。不外亏得iOS开拓中可以找到现成的读者写者锁:
pthread_rwlock_t
这是一个迂腐的C说话层面的函数,用法如下:
- // Initialization of lock, pthread_rwlock_t is a value type and must be declared as var in order to refer it later. Make sure not to copy it.
- var lock = pthread_rwlock_t()
- pthread_rwlock_init(&lock, nil)
-
- // Protecting read section:
- pthread_rwlock_rdlock(&lock)
- // Read shared resource
- pthread_rwlock_unlock(&lock)
-
- // Protecting write section:
- pthread_rwlock_wrlock(&lock)
- // Write shared resource
- pthread_rwlock_unlock(&lock)
-
- // Clean up
- pthread_rwlock_destroy(&lock)
接口简捷可是却不友爱,必要留意pthread_rwlock_t是值范例,用=赋值会直接拷贝,不警惕就会挥霍内存,其它用完后还必要记得烧毁,轻易堕落,有没有更高级更易用的API呢?
GCD barrier
dispatch_barrier_async / dispatch_barrier_sync并不是专门用来办理读者写者题目的,barrier首要用于以了局景:当执行某一使命A时,必要该行列上之前添加的全部操纵都执行完,而之后添加进来的使命,必要守候使命A执行完毕才可以执行,从而到达将使命A断绝的目标,详细进程如下图所示:

假如将barrier使命之前和之后的并发使命换为读操纵,barrier使命自己换为写操纵,就可以将dispatch_barrier_async / dispatch_barrier_sync当做读者写者锁来行使了,下面把文初的行使平凡锁实现的cache代码,用dispatch_barrier_async重写,做下比拟:
- //实现一个简朴的cache(行使平凡锁)
- - (void)setCache:(id)cacheObject forKey:(NSString *)key {
- if (key.length == 0) {
- return;
- }
- [_cacheLock lock];
- self.cacheDic[key] = cacheObject;
- ...
- [_cacheLock unlock];
- }
-
- - (id)cacheForKey:(NSString *key) {
- if (key.length == 0) {
- return nil;
- }
- [_cacheLock lock];
- id cacheObject = self.cacheDic[key];
- ...
- [_cacheLock unlock];
- return cacheObject;
- }
- //实现一个简朴的cache(行使读者写者锁)
- static dispatch_queue_t queue = dispatch_queue_create("com.gfzq.testQueue", DISPATCH_QUEUE_CONCURRENT);
-
- - (void)setCache:(id)cacheObject forKey:(NSString *)key {
- if (key.length == 0) {
- return;
- }
- dispatch_barrier_async(queue, ^{
- self.cacheDic[key] = cacheObject;
- ...
- });
- }
-
- - (id)cacheForKey:(NSString *key) {
- if (key.length == 0) {
- return nil;
- }
- __block id cacheObject = nil;
- dispatch_sync(queue, ^{
- cacheObject = self.cacheDic[key];
- ...
- });
- return cacheObject;
- }
这样实现的cache就可以并发执行读操纵,同时又有用地断绝了写操纵,分身了安详和服从。 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|