美文网首页
iOS 原理探究-自旋锁

iOS 原理探究-自旋锁

作者: Joker_King | 来源:发表于2020-03-07 11:49 被阅读0次

线程反复检查锁变量是否可用。由于线程在这一过程中保持执行, 因此是一种忙等待。一旦获取了自旋锁,线程会一直保持该锁,直至显式释 放自旋锁。 自旋锁避免了进程上下文的调度开销,因此对于线程只会阻塞很 短时间的场合是有效的。

单核CPU不适于使用自旋锁,这里的单核CPU指的是单核单线程的CPU,因为,在同一时间只有一个线程是处在运行状态,假设运行线程A发现无法获取锁,只能等待解锁,但因为A自身不挂起,所以那个持有锁的线程B没有办法进入运行状态,只能等到操作系统分给A的时间片用完,才能有机会被调度。这种情况下使用自旋锁的代价很高。

获取、释放自旋锁,实际上是读写自旋锁的存储内存或寄存器。因此这种读写操作必须是原子的

忙等

以下的C语言程序示例,两个线程共享一个全局变量i,第一个线程用忙碌等待来确认变量i的值是否有改变。

#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
​
volatile int i = 0; /* i is global, so it is visible to all functions.
 It's also marked volatile, because it
 may change in a way which is not predictable by the compiler,
 here from a different thread. */
​
/* f1 uses a spinlock to wait for i to change from 0\. */
static void *f1(void *p) {
 while (i == 0) {
 /* do nothing - just keep checking over and over */
 }
 printf("i's value has changed to %d.\n", i);
 return NULL;
}
​
static void *f2(void *p) {
 sleep(60);   /* sleep for 60 seconds */
 i = 99;
 printf("t2 has changed the value of i to %d.\n", i);
 return NULL;
}
​
int main() {
 int rc;
 pthread_t t1, t2;
 rc = pthread_create(&t1, NULL, f1, NULL);
 if (rc != 0) {
 fprintf(stderr, "pthread f1 failed\n");
 return EXIT_FAILURE;
 }
 rc = pthread_create(&t2, NULL, f2, NULL);
 if (rc != 0) {
 fprintf(stderr, "pthread f2 failed\n");
 return EXIT_FAILURE;
 }
 pthread_join(t1, NULL);
 pthread_join(t2, NULL);
 puts("All pthreads finished.");
 return 0;
}

相关文章

  • iOS 原理探究-自旋锁

    线程反复检查锁变量是否可用。由于线程在这一过程中保持执行, 因此是一种忙等待。一旦获取了自旋锁,线程会一直保持该锁...

  • 自旋锁原理

    维基百科: 自旋锁是计算机科学用于多线程同步的一种锁,线程反复检查锁变量是否可用。由于线程在这一过程中保持执行,因...

  • iOS面试题与核心基础之线程同步(锁,串行队列,信号量,@syn

    锁 iOS多线程锁有两类 自旋锁 和 互斥锁自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。资源已...

  • iOS 锁

    两张截图说明iOS锁。 锁,可概括为三种:自旋锁、信号量、互斥锁。基本原理都是让线程忙等或者睡眠,耗时的长短就在忙...

  • 锁 iOS中锁只分为两大类: 自旋锁(spin) :自旋锁其实是while轮询,避免了进程上下文的调度开销,因此对...

  • IOS - 自旋锁和atomic

    本文首发于 个人博客 多线程中的锁通常分为互斥锁和自旋锁,这篇文章主要向大家介绍一些自旋锁的原理以及atomic的...

  • iOS 不安全的OSSpinLock锁

    iOS 不安全的OSSpinLock锁 OSSpinLock OSSpinLock 是自旋锁,等待锁的线程会处于忙...

  • iOS 原理探究-互斥锁

    在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个...

  • iOS 原理探究-读写锁

    读写锁是计算机程序的并发控制的一种同步机制,也称“共享-互斥锁”、多读者-单写者锁。读操作可并发重入,写操作是互斥...

  • iOS自旋锁

    自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的...

网友评论

      本文标题:iOS 原理探究-自旋锁

      本文链接:https://www.haomeiwen.com/subject/qhmqdhtx.html