通过GCD中的dispatch_barrier_(a)sync加强对sync中所谓等待的理解
线程安全的另外一种方法,不用加锁,使用队列。
队列有个特点,先进先出。不过同步还是异步,添加任务的顺序是不变的。
队列实现线程安全举例:图书馆借书还书线程安全。
借书:应该是异步的
还书:也是异步的。
问题:怎么保证异步借书保证线程安全,不会同时借了同一本书;
dispatch_queue_t queue = dispatch_queue_create("qcdSafe.test", DISPATCH_QUEUE_CONCURRENT);
- (void)takeBook:(int)book {
dispatch_barrier_async(queue, ^{
[self.arr removeObject:@(book)];
});
}
- (void)returnBook:(int)book {
dispatch_async(queue, ^{
[self.arr addObject:@(book)];
});
}
使用队列,使用dispatch_barrier_async函数,这个函数会等待所有改任务之前的任务执行完之后才执行,并且之后的任务必须等改任务执行完才会去执行。
使用队列,主要原因就是任务有先后顺序。
网友评论