一、自旋锁
自旋锁和互斥量相似,通过加锁和解锁来保护对共享数据的保护。
和互斥量不同的是:互斥量在锁已经被占有的情况下,会阻塞等待,此时线程处于休眠状态,不占用CPU资源。而自旋锁此时虽然也会被阻塞,但是不会休眠,处于忙等的状态,不会交出CPU资源。
自旋锁适用于那些锁持有时间短不希望把时间浪费在CPU调度上的场景。
linux内核中,自旋锁被广泛的使用,因为内核模块特别是在网卡驱动中,时间精度要求很高,相比其他锁切换时间,自旋锁的忙等效率更高一些。
自旋锁的数据类型为pthread_spinlock_t
,相关函数为:
#include <pthread.h>
// 初始化和销毁自旋锁
int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
int pthread_spin_destroy(pthread_spinlock_t *lock);
// 对自旋锁加锁和解锁
int pthread_spin_lock(pthread_spinlock_t *lock);
int pthread_spin_trylock(pthread_spinlock_t *lock);
int pthread_spin_unlock(pthread_spinlock_t *lock);
自旋锁的函数定义基本和其他锁一致,具体使用方法不再详细描述。
二、示例
#include <stdio.h>
#include <pthread.h>
#include "log.h"
static int n = 0;
pthread_spinlock_t spin_lock;
static void *f(void *args) {
int idx = 0;
while (idx++ < 1000) {
pthread_spin_lock(&spin_lock);
n++;
pthread_spin_unlock(&spin_lock);
}
return 0;
}
int main() {
int i;
pthread_spin_init(&spin_lock, 0);
pthread_t ts[50];
for (i = 0; i < 50; i++) {
pthread_create(&ts[i], 0, f, 0);
}
for (i = 0; i < 50; i++) {
pthread_join(ts[i], 0);
}
pthread_spin_destroy(&spin_lock);
info("n = %d", n);
return 0;
}
编译运行:
此处评论已关闭