欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS、8大锁

程序员文章站 2022-03-03 12:47:12
...

 

锁是最常用的同步工具。
一段代码段在同一个时间只能允许被有限个线程访问,比如一个线程 A 进入需要保护代码之前添加简单的互斥锁,另一个线程 B 就无法访问,只有等待前一个线程 A 执行完被保护的代码后解锁,B 线程才能访问被保护代码。
八大锁如下:
NSLock、NSConditionLock、NSRecursiveLock、NSCondition、
@synchronized、dispatch_semaphore、OSSpinLock、pthread_mutex

1、NSLock

2、NSConditionLock

3、NSRecursiveLock

4、NSCondition

5、@synchronized

6、信号量(dispatch_semaphore)

  • // 1、创建一个信号,value:信号量
    dispatch_semaphore_create(<#long value#>)
  • //2、 使某个信号的信号量+1
    dispatch_semaphore_signal(<#dispatch_semaphore_t dsema#>)
  • // 3、线程执行dispatch_semaphore_wait时,会获取当前信号量,将信号量值减一,如果信号量值小于0,则等待dispatch_semaphore_signal唤醒线程;如果信号量值大于或等于0则开始执行任务
    dispatch_semaphore_wait(<#dispatch_semaphore_t dsema#>, <#dispatch_time_t timeout#>)
  • 4、正常的使用顺序是先降低然后再提高,这两个函数通常成对使用。
//初始化信号量,初始值N = 2,表示最多只允许两条线程同时获得信号量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
    // 并发队列
    dispatch_queue_t conQueue = dispatch_queue_create("com.hello-world.djx", DISPATCH_QUEUE_CONCURRENT);
    for (int i = 1; i <= 5; i++) {
        dispatch_async(conQueue, ^{
          // 线程执行dispatch_semaphore_wait时,会获取当前信号量,将信号量值减一,如果信号量值小于0,则等待dispatch_semaphore_signal唤醒线程;如果信号量值大于或等于0则开始执行任务
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            NSLog(@"开始任务:%d", i);
            sleep(i);
            NSLog(@"结束任务:%d", i);
            //线程执行完任务之后调用dispatch_semaphore_signal,将信号量值加一,如果此时信号量值大于0,说明没有等待的线程,直接返回,如果此时信号量值小于或等于0,表次此前信号量已用尽,可能有正等待的线程,这时候会试图唤起等待的线程
            dispatch_semaphore_signal(semaphore);
        });
    }
 

7、OSSpinLock

8、pthread_mutex