多线程并发锁分类以及简单实例
多线程并发锁
包括自旋锁、互斥锁、无锁
POSIX接口
posix接口提供linux下线程操作库,posix默认生成的线程占用8M空间
-
pthread_create
线程创建函数pthread_create(pthread_t *th, const pthread_attr_t *attr, void *(* func)(void *), void *arg) // func是函数指针,是线程要调用的函数,arg是给调用函数传的参数
锁
互斥锁mutex
线程试图访问被锁资源时,线程会被阻塞。锁释放的时候,会唤醒所有该锁上阻塞的线程。适用于锁的内容较多的情况,比如队列
pthread_mutex_t mutex; // 声明互斥量
pthread_mutex_init(&mutex, NULL); // 默认初始化
ptherad_mutex_lock(&mutex); // 加锁
ptherad_mutex_lock(&mutex); // 解锁
自旋锁spinlock
自旋锁会一直去尝试获取锁,相当于一个while
循环获取。适用于锁的内容很少比如变量,使用自旋锁,等待代价小于线程切换。此时cpu会发生空转。
pthread_spinlock_t spinlock; // 声明自旋锁
pthread_spin_init(&spinlock, PTHERAD_PROCESS_PRIVATE); // 默认初始化
ptherad_spin_lock(&spinlock); // 加锁
ptherad_spin_lock(&spinlock); // 解锁
原子操作-无锁
原子操作解决对应变量需要加锁的问题,原子操作能够将变量的指令变为单条CPU指令,这样就能够解决线程之间不同步的问题。原子操作的速度更快。
int inc(int* value, int add){
int old;
// volatile指示编译器不要对变量进行优化
__asm__ volatile(
"lock; xaddl %2, %1"
: "=a" (old)
: "m" (*value), "a" (add)
: "cc", "memory"
);
}
CAS
cas指的是Compare-And-Swap
原子操作,能够保证并发线程对共享数据安全访问和修改。
实现思路
compare
用于检测内存地址当前值是否与期望值相等,swap
如果期望值等于当前值,则将当前值作为新值。
实现方式
void cas(int *ptr, int expected, int desired) {
__asm__ volatile (
"lock; cmpxchg %2, %0\n" // 使用LOCK前缀的cmpxchg指令
: "+m" (*ptr), "+a" (expected) // 操作数约束
: "r" (desired) // 操作数约束
: "memory" // 标记内存操作
);
}
分类:
Linux
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!