加锁

来源:互联网 发布: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
原创粉丝点击