Skip to content

Latest commit

 

History

History
47 lines (43 loc) · 1.82 KB

多线程的各种锁.md

File metadata and controls

47 lines (43 loc) · 1.82 KB

多线程的各种锁

各种锁的性能图对比 各种锁的性能对比

自旋锁OSSpinLock

性能最高的锁。 原理: 一直do while忙等。 缺点: 当等待时会消耗大量 CPU 资源,所以它不适用于较长时间的任务。 优点: 对于内存缓存的存取来说,它非常合适。

OSSpinLock已经出现了BUG,导致并不能完全保证是线程安全的。苹果工程师已停用。

dispatch_semaphore 信号量

  • dispatch_semaphore_t signal = dispatch_semaphore_create(1); //传入值必须 >=0, 若传入为0则阻塞线程并等待timeout,时间到后会执行其后的语句
  • dispatch_semaphore_wait(signal, overTime):可以理解为 lock,会使得 signal值 -1
  • dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal值 +1

互斥锁pthread_mutex

pthread_mutex(recursive)

NSLock

Cocoa程序中NSLock中实现了一个简单的互斥锁,实现了NSLocking protocollock,加锁 unlock,解锁 tryLock,尝试加锁,如果失败了,并不会阻塞线程,只是立即返回 NOlockBeforeDate:,在指定的date之前暂时阻塞线程(如果没有获取锁的话),如果到期还没有获取锁,则线程被唤醒,函数立即返回NO

条件锁NSCondition

递归锁NSRecursiveLock

@synchronized

//线程1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    @synchronized (self) {
        sleep(2);
        NSLog(@"线程1");
    }
});

//线程2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    @synchronized (self) {
        NSLog(@"线程2");
    }
});

NSConditionLock条件锁