加锁
来源:互联网 发布:stc单片机iap远程升级 编辑:程序博客网 时间:2024/04/30 01:20
加锁
加锁的定义
锁机制是多线程编程中最常用的同步机制,用来对多线程间共享的临界区进行保护。
linux下的几种加锁
mutex(互斥锁)
提供一个可以在同一时间,只让一个线程访问临界资源的的操作接口。互斥锁是个提供线程同步的基本锁。让上锁后,其他的线程如果想要锁上,那么会被阻塞,直到锁释放后。
如果,在锁释放后,有多个线程被阻塞,那么,所有的被阻塞的线程会被设为可执行状态。第一个执行的线程,取得锁的控制权,上锁。其他的线程继续阻塞。
自旋锁 spinlock 当获取不成功时,不会睡眠,会一直循环查找锁是否被释放,必须在不能睡眠的代码中使用。在单cpu没有打开抢占的情况下,自选锁相当于不存在,在打开抢占的情况下,自选锁的作用是禁止抢占。
信号量 semaphone 只有一个持有者的信号量 叫mutex,当获取不成功时,任务会把自身放到一个队列中睡眠,一直等到信号量被释放时才唤醒。必须在能睡眠的代码中使用。
加锁原因:因为在对共享数据或者共享资源进行并发访问的时候,会使数据错乱
代码中实现加锁
自旋锁
#define spin_lock(lock) _spin_lock(lock) #define _spin_lock(lock) __LOCK(lock) #define __LOCK(lock) \ do { preempt_disable(); __acquire(lock); (void)(lock); } while (0);
使用方法:
Static spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED; spin_lock(&xxx_lock); … spin_unlock(&xxx_lock);
信号量
void down(struct semaphore *sem) { unsigned long flags;spin_lock_irqsave(&sem->lock, flags); if (likely(sem->count > 0)) sem->count--; else __down(sem); spin_unlock_irqrestore(&sem->lock, flags);} for (;;) { if (signal_pending_state(state, task)) goto interrupted; if (timeout <= 0) goto timed_out; __set_task_state(task, state); spin_unlock_irq(&sem->lock); timeout = schedule_timeout(timeout); spin_lock_irq(&sem->lock); if (waiter.up) return 0; }
使用方法
Static DECLARE_MUTEX(xxx_lock); down(&xxx_lock); … up(&xxx_lock);
0 0
- 加锁
- 加锁
- 加锁
- 加锁
- 加锁
- 加锁
- 加锁
- 厕所~加锁
- sql 加锁
- 文件加锁
- 加锁类
- 文件加锁
- 文件加锁
- 多线程加锁
- 加锁 synchronize
- 客户端加锁
- 文件加锁
- hibernate 加锁
- 数据结构
- 六、String类的练习
- 进程与线程
- 第十一章 异常处理
- zizaco/entrust 5.2.x-dev Class name must be a valid object or a string
- 加锁
- c 语言
- 【总结】AWS的(助理)架构师认证体系详解
- 在Windows上编译mono
- 58同城赶集的数据库开发架构设计
- 直播项目技术备忘
- Codeforces 667D World Tour【最短路+枚举】
- 解析XML格式数据
- HDU 2010