iOS、8大锁
程序员文章站
2022-03-03 12:47:12
...
锁是最常用的同步工具。
一段代码段在同一个时间只能允许被有限个线程访问,比如一个线程 A 进入需要保护代码之前添加简单的互斥锁,另一个线程 B 就无法访问,只有等待前一个线程 A 执行完被保护的代码后解锁,B 线程才能访问被保护代码。
八大锁如下:
NSLock、NSConditionLock、NSRecursiveLock、NSCondition、
@synchronized、dispatch_semaphore、OSSpinLock、pthread_mutex
一段代码段在同一个时间只能允许被有限个线程访问,比如一个线程 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); }); }