1.OSSpinLock
OSSpinLock 自旋锁,性能最高的锁。原理很简单,就是一直 do while 忙等。它的缺点是当等待时会消耗大量 CPU 资源,所以它不适用于较长时间的任务。对于内存缓存的存取来说,它非常合适。
内存访问速度很快,锁占用的时间少,所以用的速度最快的OSSpinLockLock
声明
pthread_mutex_t _lock;
pthread_mutex_init(&_lock, NULL);
使用
dispatch_queue_t _queue;
_queue = dispatch_queue_create(“com.ibireme.cache.memory”, DISPATCH_QUEUE_SERIAL);
dispatch_async(_queue, ^{
pthread_mutex_lock(&_lock);
//code
pthread_mutex_unlock(&_lock);
});
2.dispatch_semaphore
dispatch_semaphore 是信号量,但当信号总量设为 1 时也可以当作锁来。在没有等待情况出现时,它的性能比 pthread_mutex 还要高,但一旦有等待情况出现时,性能就会下降许多。相对于 OSSpinLock 来说,它的优势在于等待时不会消耗 CPU 资源。对磁盘缓存来说,它比较合适。
声明并且初始化:
//#define Lock() dispatch_semaphore_wait(self->_lock, DISPATCH_TIME_FOREVER)
//#define Unlock() dispatch_semaphore_signal(self->_lock)
static dispatch_semaphore_t _globalInstancesLock;
static void _initGlobal() {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_globalInstancesLock = dispatch_semaphore_create(1);
}); }
使用
dispatch_semaphore_wait(_globalInstancesLock, DISPATCH_TIME_FOREVER);
//code
dispatch_semaphore_signal(_globalInstancesLock);