一.使用GCD實現(xiàn)多讀單寫
1.dispatch_barrier_async
dispatch_barrier_sync()或者dispatch_barrier_async()入隊的block,會等到所有的之前入隊的block執(zhí)行完成后才開始執(zhí)行渠退。在barrier block后面入隊的所有的block蕾盯,會等到到barrier block本身已經(jīng)執(zhí)行完成之后才繼續(xù)執(zhí)行妙同。
-
dispatch_barrier 是一個類似于dispatch_async()/dispatch_sync()的API属拾,它可以將barrier block提交到隊列中,barrier block 只有提交到自定義的并發(fā)隊列中才能真正的當做一個柵欄,它在這里起到一個承上啟下的作用,只有比它(barrier block)先提交到自定義并發(fā)隊列的block全部執(zhí)行完成,它才會去執(zhí)行,等它執(zhí)行完成腮恩,在它之后添加的block才會繼續(xù)往下執(zhí)行。
-
當dipatch_barrier block沒有被提交到自定義的串行隊列中温兼,它與dispatch_async()/dispatch_sync()的作用是一樣的秸滴。
場景需求:需要異步完成三個任務。任務一募判、任務二荡含、任務三。要求:任務三必須在任務一届垫、任務二完成之后觸發(fā)释液。這就需要使用dispatch_barrier_async。
特點:像一堵圍墻装处、成為任務的分割線误债。
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
//任務1
for (int i = 0; i < 2; i++) {
NSLog(@"我是任務一、來自線程:%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//任務2
for (int i = 0; i < 2 ; i++) {
NSLog(@"我是任務二妄迁、來自線程:%@",[NSThread currentThread]);
}
});
dispatch_barrier_async(queue, ^{
//柵欄
for (int i = 0; i < 1 ; i++) {
NSLog(@"我是分割線寝蹈、來自線程:%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
//任務3
for (int i = 0; i < 1 ; i++) {
NSLog(@"我是任務三、來自線程:%@",[NSThread currentThread]);
}
});
2.使用dispatch_barrier_async實現(xiàn)多讀單寫鎖
- (void)test2{
// 這里必須的自定義的并發(fā)隊列登淘,不能使用全局并發(fā)隊列箫老,或者串行隊列
self.queue = dispatch_queue_create("my_quene", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10; i++) {
dispatch_async(self.queue, ^{
[self read];
});
dispatch_async(self.queue, ^{
[self read];
});
dispatch_async(self.queue, ^{
[self read];
});
dispatch_barrier_async(self.queue, ^{
[self write];
});
}
}
- (void)read {
NSLog(@"read");
}
- (void)write
{
NSLog(@"write");
}
一.使用pthread_rwlock_t實現(xiàn)多讀單寫
#import "ViewController.h"
#import <pthread.h>
@interface ViewController ()
@property (assign, nonatomic) pthread_rwlock_t lock;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化鎖
pthread_rwlock_init(&_lock, NULL);
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
for (int i = 0; i < 10; i++) {
dispatch_async(queue, ^{
[self read];
});
dispatch_async(queue, ^{
[self write];
});
}
}
- (void)read {
pthread_rwlock_rdlock(&_lock);
NSLog(@"read");
pthread_rwlock_unlock(&_lock);
}
- (void)write
{
pthread_rwlock_wrlock(&_lock);
NSLog(@"write");
pthread_rwlock_unlock(&_lock);
}
- (void)dealloc
{
pthread_rwlock_destroy(&_lock);
}
@end
- pthread_rwlock_rdlock 讀取鎖
- pthread_rwlock_wrlock 寫入鎖
- pthread_rwlock_destroy 銷毀鎖