Skip to content

线程同步之自旋锁

  • 自旋锁和互斥锁的原理是一样的

线程同步之互斥量

互斥量可以阻止某个线程执行(加锁、释放锁),互斥量可以保证先后执行

自旋锁和互斥锁的区别

  • 自旋锁也是一种多线程同步的变量
  • 使用自旋锁的线程会反复检查锁变量是否可用
  • 自旋锁不会让出CPU,是一种忙等待状态
  • 因此,自旋锁就是死循环等待锁被释放的一种锁

自旋锁的好处

  • 自旋锁避免了进程或线程上下文切换的开销,如果锁占用的时间不是很长的话,使用自旋锁的代价也是很小的。
  • 操作系统内部很多地方使用的是自旋锁
  • 自旋锁不适合在单核CPU使用,因为自旋锁在等待的时候并不会释放CPU,而是死循环的去等待,因此如果是在单核的cpu中去使用的话将会引起其他的进程或线程无法去执行。

自旋锁操作系统提供的API

  • pthread_spinlock_t

自旋锁的例子

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <vector>

pthread_spinlock_t spin_lock;

int num = 0;

void *producer(void*){
    int times = 10000000;
    while(times --){
        pthread_spin_lock(&spin_lock);
        num += 1;
        pthread_spin_unlock(&spin_lock);
    }
}

void *comsumer(void*){
    int times = 10000000;
    while(times --){
        pthread_spin_lock(&spin_lock);
        num -= 1;
    sleep(10);
        pthread_spin_unlock(&spin_lock);
    }
}


int main(){
    printf("Start in main function.\n");
    pthread_spin_init(&spin_lock, 0);
    pthread_t thread1, thread2;
    pthread_create(&thread1, NULL, &producer, NULL);
    pthread_create(&thread2, NULL, &comsumer, NULL);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    printf("Print in main function: num = %d\n", num);
    return 0;
}