天天看点

ios笔记:OSSpinLock锁和dispatch_semaphore锁

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);