自旋锁和互斥锁

互斥锁

定义:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会进入睡眠状态等待任务执行完毕, 直到上一个执行完成,下一个线程会自动唤醒,然后开始珍惜任务

互斥锁原理:线程会从sleep(加锁)-->running(解锁), 过程中有上下文的切换(主动出让时间片, 线程休眠, 等待下一次唤醒).CPU的抢占,信号的发送等开销.

互斥锁会休眠: 所谓休眠, 即在访问被锁资源时, 调用者线程会休眠, 此时CPU可以调度其他线程工作.直到被锁资源释放锁.此时会唤醒休眠线程.

互斥锁:@synchronized,NSLock, pthread_mutex, NSConditionLock, NSCondition, NSRecursiveLock


自旋锁

定义:一种用于保护多线程共享资源的锁. 与一般互斥锁(mutex)不同之处在于当自旋锁尝试获取锁时以忙等待(busy waiting)的形式不断地循环检查锁是否可用.当上一个线程的任务没有执行完毕的时候,下一个线程处于一直等待状态,不会休眠,直到上一个执行完毕.

自旋锁原理:线程一直是running(加锁——>解锁), 死循环(忙等do-while)检测锁的标志位,机制不复杂.

优点:自旋锁不会引起调用者睡眠,所以不会进行线程调度,CPU时间片轮转等耗时操作.如果能在很短的时间内获得锁,自旋锁的效率远高于互斥锁.适用于持有锁较短的程序.

缺点:自旋锁一直占用CPU,在未获得锁的情况下,自旋锁一直运行(忙等状态,询问), 占用着CPU,如果不能在很短的时间内获得锁,这无疑会使CPU效率降低. 自旋锁不能实现递归调用.

自旋锁:atomic、OSSpinLock、dispatch_semaphore_t

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容